我一直在开发一个针对android的游戏。我知道在项目完成之前不要考虑程序优化,但我想知道大多数手机在不熔化或破坏电池的情况下能安全地处理多少纹理。我已经看到,纹理的最大大小应该是1024或2048像素平方(我一直在将雪碧片合并成1024x1024地图集),但我不禁想知道我在运行时可以使用多少像素。我知道它应该依赖GPU,但是是什么规范决定了它呢?
发布于 2016-11-19 20:00:45
绝大多数移动设备(以及具有集成图形而不是专用图形卡的桌面)使用共享内存体系结构,其中VRAM --即为视频存储的RAM --是系统RAM的一部分。图形API使用的纹理只是指向VRAM块的指针;API本身没有人为的限制。
这里一个典型的混乱来源是纹理单元的数量非常有限。这些是GPU硬件中的电路,可以“绑定”到特定的纹理,并为我们执行采样。重要的是,这个限制只适用于单个着色器。实际上,如果一个系统有32个纹理单元,那么单个着色器最多可以同时使用32个纹理。请注意,还有另一个类似的限制,它影响着色器某一特定阶段可以同时使用多少纹理(每个阶段限制的纹理)。
请注意:提高内存使用的一个简单方法是使用纹理压缩。现在大多数手机都支持某种形式的纹理压缩,许多引擎默认支持它(这些纹理单元可以直接从压缩数据中提取)。
这些纹理单元是专用的硬件部件,因此它们所能处理的纹理大小受到物理上的限制。执行采样的电路设计为对功率为2的图像进行操作.这就是为什么设备的纹理大小有限,从512到更高,而且它们的功率总是2.1080,对于地图集来说是一个尴尬的大小,因为它不是2的幂(所以硬件可能决定把它升级到2048年)。
发布于 2016-11-19 20:22:15
限制取决于:
这不是有多少人的问题。这不是一个有多大的问题。这是所有因素加在一起的问题。
您可以显示4000个16x16纹理,而手机可能比在屏幕上绘制四个1024x1024纹理更快地处理这个问题。
CPU和GPU在大多数移动平台上共享相同的内存总线,这意味着如果其中一个使用总线来读取或写入内存,另一个必须等待轮到它。
因此,您可以运行测试,并看到GPU是以一定的帧速率精细绘制N个带有AxB纹理的三角形,并运行CPU速度测试,但是当您将GPU (绘图)和CPU处理(音频、加载/解压缩、物理、粒子和3D模型动画)结合在一起时,GPU的性能突然下降。或者它可以是另一种方式,GPU比CPU具有访问内存的优先级,或者两者混合在一起,这取决于系统。
GPU和CPU通常并行运行,但它们仍然必须在共享内存系统上“争夺”内存访问。
https://gamedev.stackexchange.com/questions/133274
复制