就像在 PC 上一样,iOS 和 Android 等移动平台拥有各种性能水平的设备。可轻松找到比其他手机功能强大 10 倍的手机。 非常简单的扩展方式:
1.确保在基线配置上运行正常 1.在性能更高的配置上使用更多视觉效果: * 分辨率 * 后期处理 * MSAA * 各向异性 * 着色器 * Fx/粒子密度,开/关
图形性能受填充率、像素和几何复杂度(顶点数)限制。如果能找到一种方法来剔除更多渲染器,所有这三种因素都可以减少。这种情况下,遮挡剔除可能会很有作用,因为 Unity 会自动剔除视锥体外的对象。
在移动平台,本质上将受填充率限制(填充率 = 屏幕像素 * 着色器复杂度 * 过度绘制),而过于复杂的着色器是导致问题的最常见原因。因此,请使用 Unity 附带的移动端着色器,或设计您自己的着色器,但尽可能简化它们。如果可能,通过将代码移动到顶点着色器来简化像素着色器。
If reducing the Texture Quality in Quality settings makes the game run faster, you are probably limited by memory bandwidth. So compress textures, use mipmaps, reduce texture size, etc.
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.前向渲染的像素光源的成本很高。 * 尽可能使用光照贴图而不是实时光源。 * Adjust pixel light count in Quality settings. Essentially only the directional light should be per pixel, everything else - per vertex. Certainly this depends on the game. 1. Experiment with Render Mode of Lights in the Quality settings to get the correct priority. 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 实现的,因此由操作系统决定需要为下载创建多少个线程。启动多个并发下载时,应注意可支持的总设备带宽和可用内存量。每个并发下载都会分配自己的临时缓冲区,因此应注意不要耗尽内存。
有时控制台中不显示任何信息,只是发生随机崩溃