就像在 PC 上一样,iOS 和 Android 等移动平台拥有各种性能水平的设备。可轻松找到比其他手机功能强大 10 倍的手机。 非常简单的扩展方式:
1.确保在基线配置上运行正常 1.在性能更高的配置上使用更多视觉效果: * 分辨率 * 后期处理 * MSAA * 各向异性 * 着色器 * Fx/粒子密度,开/关
图形性能受填充率、像素和几何复杂度(顶点数)限制。如果能找到一种方法来剔除更多渲染器,所有这三种因素都可以减少。这种情况下,遮挡剔除可能会很有作用,因为 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 精度限定符。
以下是确保良好实践的检查清单:
1.保持材质数量尽可能少。这样使 Unity 更容易进行批量处理。 1.使用纹理图集(包含子图像集合的大图像)代替多个单独的纹理。这些纹理图集的加载速度更快,状态切换更少,并支持批处理。 1.如果使用纹理图集和共享材质,请用 Renderer.sharedMaterial 而不是 Renderer.material。 1.前向渲染的像素光源的成本很高。 * 尽可能使用光照贴图而不是实时光源。 * 调整 Quality 设置中的像素光源数。本质上只有方向光应该是每个像素光源,其他所有光源都应该是每顶点光源。当然这取决于游戏。 1.尝试 Quality 设置中的光源渲染模式,以获取正确的优先级。 1.除非确实有必要,否则避免使用镂空(Alpha 测试)着色器。 1.保持透明(Alpha 混合)屏幕覆盖率最小化。 1.尽量避免多个光源为给定对象提供光照的情况。 1.尝试减少着色器通道(阴影、像素光源、反射)的总数。 1.渲染顺序至关重要。一般情况为: * 完全不透明对象(大致为从前到后)。 * Alpha 测试对象(大致为从前到后)。 * 天空盒。 * Alpha 混合对象(必要时从后到前)。 1.后期处理在移动端的成本很高,请小心使用。 1.粒子:减少过度绘制,使用尽可能最简单的着色器。 1.使每帧都修改的网格的缓冲区加倍:
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 实现的,因此由操作系统决定需要为下载创建多少个线程。启动多个并发下载时,应注意可支持的总设备带宽和可用内存量。每个并发下载都会分配自己的临时缓冲区,因此应注意不要耗尽内存。
有时控制台中不显示任何信息,只是发生随机崩溃