使用高分辨率纹理优化SceneKit性能

Ner*_*ken 5 memory out-of-memory uiimage ios scenekit

我是一个相当有经验的iOS开发人员,但是一个完整的SceneKit新手,试图在一个基本的应用程序中模拟一些行星.

为此,我正在使用适用于基本球体的高分辨率火星,金星等的普通和漫反射贴图.他们工作!它们看起来很棒,正是我想要的.

在此输入图像描述 在此输入图像描述

问题是,我被质量/内存权衡所打死.

我可以缩小纹理的尺寸以减少内存占用,但是在某个分辨率以下,结果(特别是法线贴图)开始变得非常糊涂和可怕.应用程序需要能够至少缩放到行星的屏幕宽度,但为了保持山脉和山谷的任何清脆度,我需要使用大约6000 x 3000的PNG法线贴图(上图).我可以缩放漫反射地图的方式下降到大约1000 x 500,但即使这样,也会从单个球体轻轻旋转中获得周期性的记忆崩溃,只有一个光,没有背景,没有物理,没有其他几何.

现在,我知道这是一张超高分辨率的普通地图.我知道了.但与此同时,它只是一个领域,什么都不做.这甚至没有接近我见过的其他应用程序执行完美的复杂性,即使有一些非常详细的纹理.似乎必须有一些方法可以为单个对象获取高细节表面纹理,而不会使应用程序崩溃.

所以,作为一个完整的SceneKit新手,我想知道:有没有任何技巧可以获得良好的SceneKit纹理质量而不使用世界上所有的内存? 也许一种处理图像纹理,重新编码文件,更改场景/节点设置等的方法?任何方式都可以通过较小的图像获得清晰的质量,或者使用相同的图像降低内存使用率?

我很乐意引用一些代码,但现在没有太多要显示的.我以标准方式将纹理应用于SceneKit节点,并且它可以工作.我只是因缺乏记忆或缺乏图像质量而死亡.

谁能帮我吗?

Sea*_*ean 0

我认为这个想法是明智地分割球体纹理,这样它在任何时候都只显示大约 60 度的纹理,类似于缩放时以高分辨率显示图片的方式。我不知道如何去做,但这是我的猜测。