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

7
我是一名经验丰富的iOS开发者,但在SceneKit方面完全是新手,尝试在基本应用程序中模拟一些行星。
为此,我使用了火星、金星等高分辨率法线和漫反射贴图,应用于基本球体。它们起作用了!它们看起来很棒,完全符合我的预期。

enter image description here enter image description here

问题是,我正在受到质量/内存权衡的困扰。
我可以缩小纹理的尺寸以减少内存占用,但是在低于一定分辨率时,结果(特别是法线贴图)开始变得非常模糊和可怕。应用程序需要能够缩放至少到行星屏幕宽度,但为了保持山脉和山谷的任何清晰度,我需要使用大约为6000 x 3000的PNG法线贴图(如上所示)。我可以将漫反射贴图缩小到大约1000 x 500,但即使这样,单个球体轻轻旋转,带有单个光源,没有背景,没有物理学和其他几何形状,仍然会出现周期性内存崩溃。
现在,我知道那是一个超高分辨率的法线贴图。我懂的。但同时,这只是一个球体,什么也没做。这甚至都不接近其他应用程序无缝执行的某些复杂性,即使具有一些相当详细的自己的纹理。似乎必须有某种方法可以获得单个对象的高详细度表面纹理,而不会使应用程序崩溃。
作为一个完全不懂SceneKit的新手,我想知道:在不占用所有内存的情况下获得良好的SceneKit纹理质量有什么技巧吗?也许有一种处理图像纹理的方法,重新编码文件,更改场景/节点设置等等?是否有任何方法可以使用较小的图像或相同图像的较低内存使用量来获得清晰的质量? 我很乐意引用一些代码,但现在没有太多可展示的。我按照标准方式将纹理应用于SceneKit节点,并且它有效。我只是因为缺乏内存或图像质量而感到痛苦。 有人能帮帮我吗?

几何数据不应占用太多内存。物理/动画/粒子在内存方面应该可以忽略不计。因此,如果一切顺利(即没有泄漏),你的内存使用量的90%应该由纹理使用。同时有多少个星球/大型纹理?您是否尝试根据行星和视点之间的距离切换高分辨率/低分辨率? - Toyos
@Toyos 我只有一个行星,有两个纹理:正常和漫反射。这个行星可以正常旋转,但是如果我尝试做其他事情(比如在视图中添加标签,或者回到主屏幕并返回应用程序),它就会冒着内存终止的风险。虽然不是每次都会出现,但大约每3-4次就会出现一次。这种情况足以令人无法接受,并且对于这样一个简单的场景来说,实在有些令人困惑。至于切换分辨率,这是一个好主意,但是这个应用程序中的行星始终停留在前景,所以从未有过切换到低分辨率的时候。 - Nerrolken
这听起来对我来说很有bug。在1000x500的情况下,你不应该遇到任何问题。但是我会添加一个奇怪的东西来尝试一下...出于习惯,我总是使用^2大小的纹理。所以试试1024x512,看看是否有所不同。这可能是因为纹理打包背后的思想已经存在几十年了,可能还没有适应更多样化的世界,涉及其他类型的数字。 - Confused
@困惑 据我所知,吃掉大量内存的不是1000x500的漫反射纹理,而是6000x3000的法线贴图。或者这也不是问题? - Nerrolken
啊,抱歉。我误解了你的意思,以为你在使用1000x500的Normal和Diffuse贴图,并且仍然存在问题。不,你的Normal贴图使用6000x3000绝对是个问题。你能将其限制在4096x2048吗?这应该在现代硬件上没有问题。 - Confused
显示剩余2条评论
1个回答

0

我认为这个想法是根据纹理将球体进行分段,以便在任何时候仅显示大约60度的纹理,就像在缩放时高分辨率显示图片一样。我不确定如何去做,但这是我的猜测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接