Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用高分辨率纹理优化SceneKit性能_Ios_Memory_Uiimage_Out Of Memory_Scenekit - Fatal编程技术网

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

Ios 使用高分辨率纹理优化SceneKit性能,ios,memory,uiimage,out-of-memory,scenekit,Ios,Memory,Uiimage,Out Of Memory,Scenekit,我是一名经验丰富的iOS开发人员,但完全是一名SceneKit新手,试图在一个基本应用程序中模拟一些行星 为此,我使用了火星、金星等的高分辨率法线和漫反射贴图,应用于基本球体。他们工作了!它们看起来很棒,正是我想要的 问题是,我正在被质量/内存的权衡所扼杀 我可以缩小纹理的尺寸以减少内存占用,但低于某个分辨率时,结果(尤其是法线贴图)开始看起来非常模糊和糟糕。该应用程序需要能够至少缩放到屏幕宽度的行星位置,但为了保持山峦和山谷的清晰,我需要使用6000 x 3000左右的PNG法线地图(上图

我是一名经验丰富的iOS开发人员,但完全是一名SceneKit新手,试图在一个基本应用程序中模拟一些行星

为此,我使用了火星、金星等的高分辨率法线和漫反射贴图,应用于基本球体。他们工作了!它们看起来很棒,正是我想要的

问题是,我正在被质量/内存的权衡所扼杀

我可以缩小纹理的尺寸以减少内存占用,但低于某个分辨率时,结果(尤其是法线贴图)开始看起来非常模糊和糟糕。该应用程序需要能够至少缩放到屏幕宽度的行星位置,但为了保持山峦和山谷的清晰,我需要使用6000 x 3000左右的PNG法线地图(上图)。我可以将漫反射贴图缩放到1000 x 500左右,但即便如此,我还是会定期从一个球体上获得内存崩溃,该球体轻轻旋转,只有一束光,没有背景,没有物理,也没有其他几何体。

现在,我知道这是一个超高分辨率的法线贴图。我明白了。但同时,它只是一个球体,什么也不做。这甚至比不上我见过的其他应用程序完美执行的复杂性,即使它们自己有一些非常详细的纹理。似乎一定有某种方法可以在不破坏应用程序的情况下为单个对象获取高细节表面纹理

因此,作为一个完全的SceneKit新手,我想知道:有什么技巧可以在不使用世界上所有内存的情况下获得良好的SceneKit纹理质量?可能是处理图像纹理、重新编码文件、更改场景/节点设置等的一种方法?有没有办法通过更小的图像获得清晰的质量,或者通过相同的图像降低内存使用率

我很乐意引用一些代码,但现在没有太多东西可以展示。我以标准的方式将纹理应用到SceneKit节点,效果很好。我要么是因为缺乏记忆,要么是因为缺乏图像质量


有人能帮我吗?

我想我们的想法是对球体纹理进行分段,这样它在任何时候都只能显示大约60度的纹理,类似于缩放时以高分辨率显示图片的方式。我不知道该怎么做,但这是我的猜测

几何数据不应占用太多内存。物理/动画/粒子在内存方面应该可以忽略不计。因此,如果一切顺利(即没有泄漏),纹理应该使用90%的内存。你同时拥有多少行星/大纹理?你试过根据行星和视角之间的距离切换高分辨率/低分辨率吗?@Toyos我只有一个行星有两种纹理:法线和漫反射。行星运转正常,旋转正常,但如果我尝试做任何其他事情(如在视图中添加标签,或转到主屏幕并返回应用程序),则有内存终止的风险。不是每次,但可能每3-4次就有1次。一直都是不可接受的,坦白说,对于这样一个简单的场景有点困惑。至于转换分辨率,这是一个好主意,但这个应用程序中的星球一直处于前景中,所以从来没有时间切换到低分辨率。对我来说,这听起来很麻烦。在1000x500,您不应该有任何问题。但我会添加一个奇怪的东西来尝试。。。出于习惯,我总是使用^2大小的纹理。所以试试1024x512,看看这是否有区别。这可能是因为纹理打包背后的想法已经有几十年的历史了,可能还没有经过调整以利用涉及其他类型数字的更为多样化的世界。@据我所知,并不是1000x500漫反射纹理占用了这么多内存,而是6000x3000法线贴图。或者这也不是问题吗?啊,对不起。我读到了,因为您使用1000x500进行普通和漫反射,但仍然存在问题。不,6000x3000对于你的法线贴图来说是个问题,非常肯定。你能把它限制在4096x2048吗,在现代硬件上应该可以。