就像在 PC 上一样,iOS 和 Android 等移动平台拥有各种性能水平的设备。可轻松找到比其他手机功能强大 10 倍的手机。 非常简单的扩展方式:
图形性能受填充率、像素和几何复杂度(顶点数)限制。如果能找到一种方法来剔除更多渲染器,所有这三种因素都可以减少。这种情况下,遮挡剔除可能会很有作用,因为 Unity 会自动剔除视锥体外的对象。
在移动平台,本质上将受填充率限制(填充率 = 屏幕像素 * 着色器复杂度 * 过度绘制),而过于复杂的着色器是导致问题的最常见原因。因此,请使用 Unity 附带的移动端着色器,或设计您自己的着色器,但尽可能简化它们。如果可能,通过将代码移动到顶点着色器来简化像素着色器。
如果降低 Quality 设置中的纹理质量 (Texture Quality) 能提高游戏运行速度,表明可能受到内存带宽的限制。因此,应压缩纹理、使用 Mipmap、减小纹理大小等。
LOD(细节级别):将对象简化或在对象移动到更远位置时完全剔除它们。
移动端 GPU 在产生的热量、使用的功率以及可能的大小或噪声等方面都有很大的约束。因此,与桌面端部件相比,移动端 GPU 具有低得多的带宽、更低 ALU 性能和更弱的纹理功能。GPU 的架构也经过调整,旨在尽可能减少带宽和功率。
Unity 针对 OpenGL ES 2.0 进行了优化,采用 GLSL ES(类似于 HLSL)着色语言。内置着色器通常用 HLSL(也称为 Cg)编写而成。对于移动平台,这些着色器将交叉编译为 GLSL ES。如果需要,也可直接编写 GLSL,但这样做会局限于 OpenGL 类平台(例如,移动端 + Mac),因为目前没有 GLSL > HLSL 转换工具。在 HLSL 中使用 float/half/fixed 类型时,它们最终会在 GLSL ES 中生成 highp/mediump/lowp 精度限定符。
以下是确保良好实践的检查清单:
void Update (){
// 在网格之间翻转
bufferMesh = on ? meshA : meshB;
on = !on;
bufferMesh.vertices = vertices; // 修改网格
meshFilter.sharedMesh = bufferMesh;
}
检查是否收到填充率限制很容易:如果降低显示分辨率,游戏运行速度是否会加快?如果是,表明受限于填充率。
尝试通过以下方法降低着色器复杂性:
通常情况下,游戏在像素处理方面受限于 GPU。因此,这些游戏最终还有未使用的 CPU 处理能力,尤其是在多核移动端 CPU 上。因此,通常情况下将一些工作从 GPU 转移到 CPU 是明智的做法(由 Unity 执行所有这些转移操作),如以下工作:网格蒙皮、小对象的批处理、粒子几何体更新。
这些方法应谨慎使用,而不是盲目进行。如果未受到绘制调用的约束,那么批处理实际上对性能更不利,因为这种处理方式会降低剔除效率并使更多对象受到光源的影响!
物理组件可能很消耗 CPU。可通过 Editor 性能分析器对其进行分析。如果物理组件在 CPU 上占用太多时间:
以下是流行的移动平台架构。移动平台的硬件供应商不同于 PC/游戏主机领域,GPU 架构也非常不同于“常规”GPU。
花一些时间研究不同的渲染方法,并相应地设计游戏。特别要注意排序。在开发周期的早期定义支持的最低端设备。在设计游戏时使用性能分析器在这些设备上进行测试。
使用特定于平台的纹理压缩格式。
只需要关注 PowerVR 架构(基于区块、延迟)。
这意味着:
缺点:
下载是通过操作系统提供的异步 API 实现的,因此由操作系统决定需要为下载创建多少个线程。启动多个并发下载时,应注意可支持的总设备带宽和可用内存量。每个并发下载都会分配自己的临时缓冲区,因此应注意不要耗尽内存。
有时控制台中不显示任何信息,只是发生随机崩溃