编辑器优化
压缩纹理
不必要的高分辨率纹理很容易成为移动游戏中的瓶颈,造成硬件效率降低。 因此,您不仅需要确认场景中所用纹理是否采用压缩格式,而且还需要核实您已经选中 Generate Mip Maps 复选框,以支持 MIP 贴图处理。 除纹理分辨率之外,MIP 贴图处理类似于之前讨论的 LOD 系统。如果您绘制的任何对象距离摄像头太远,那么不必使用 1024 x 1024 纹理获取其细节,因为该对象可能只有几个像素。
图 44. 在选定纹理的 Inspector 选项卡上压缩纹理和生成 MIP
您可在 GPA 中进行帧捕获,并查看 Texture选项卡了解您想要调查的绘制调用,以确认纹理得到压缩,且生成了 MIP。需要注意的是,生成 MIP 贴图将产生更多数据,因此实际上在有些情况下会导致性能下降。请您一如既往地在应用中确认这一选项。
图 45. 在帧分析器中查看纹理的第 4 MIP 层和格式。
移动存储着色器
当您在移动应用中使用存储着色器时,需要切换至 Unity 提供的移动版副本,以确保使用精确度较低的浮点值和移动特定优化。 选择您的材料,并在下拉菜单中找到 Mobile 部分,以在应用中进行试用(图 41)。
图 46. Unity 中的存储着色器
静态批处理
批处理将着色相似的几何图形整合至单绘制调用中。这能够减少通常额外调用造成的驱动程序开销。 您可通过选择 File->Build Settings>Player Settings 并勾选所列“Static Batching”选项打开静态批处理。Unity 现默认支持这些设置。
图 47. Other Settings 中 Rendering 下的 Static Batching 和 Dynamic Batching 复选框
对于所有不会迁移的游戏对象,勾选静态复选框。这可支持将静态批处理功能用于共享一种材料的多个相似对象。
图 48. 基于对象的批处理勾选
- 确保您使用 Renderer.sharedMaterial,而非 Renderer.material,以保证材料共享。
- 尽可能地将同一材料所用的多个纹理(漫射、凹凸高光等)整合至一个纹理图集中,以增加批处理对象的数量。
大多数时候,静态批处理可为您的应用提供巨大优势,但在有些情况下最好不要使用它。 如果您需要减少内存使用,那么最好不要使用静态批处理。 事实上,共享几何数据的对象必须将各个实例顶点/索引数据的副本整合至绘制调用的顶点和索引缓冲区内。 Unity 举例说明了静态批处理在密林场景中可能出现问题的情形。在这种极端环境中,您需要在发出调用之前,将所有使用相同材料的树木整合至相应缓冲区中,但这可能导致性能问题。
动态批处理
动态批处理虽与静态批处理的概念相同,但主要针对动态对象(可移动对象)进行绘制调用批处理。
- 动态批处理仅适用于总顶点属性低于 900 的对象(可能随时更改)。
- 接收实时阴影的对象将无法进行批处理。
HDR – 高动态范围
如果您使用延迟渲染技术获得了具有 HDR 效果的场景(例如爆炸和燃烧),那么通过勾选 Camera 设置中的 HDR 选框,您将发现绘制调用大幅减少。 需要注意的是,每个摄像头都有其自己的 HDR 复选框。 在使用带有延迟渲染的 DirectX 10 或更高版本时,最好使用 HDR。 HDR 与片段着色器之间有着最紧密的关联。 如果您想要使用 HDR 效果,那么请遵循以下准则:
- 使用延迟渲染
- 针对需要 HDR 产生效果的各摄像头,勾选 HDR 选框(图 44)
图 49. Camera 设置中的 HDR 选项
选择最佳渲染路径
为您的应用选择最佳渲染路径在很大程度上依赖于您想要完成什么工作。以下内容简要概述了 Unity 提供的各个渲染路径及其优劣。希望通过这些信息,您能够了解根据您项目的具体情况,您应选择哪种路径,但与其余这些优化一样,始终需要对各个选项进行测试! 了解哪种渲染路径最适合您的游戏的绝佳方式是使用代码编写一个开关。您只需按下开关按钮即可改变渲染路径,然后通过 Unity 分析器和 GPA 实时观察每个路径的效果。
顶点光照渲染
图 50. 通过顶点光照路径渲染的场景最终渲染目标
- 优点
- 仅按照每顶点,而非每像素,进行照明计算
- 将对带有 1024 个顶点的模型(覆盖 4k 显示器的整个全屏窗口)进行照明计算:
- 使用每顶点照明方法,计算 1024 次
- 使用每像素照明方法,计算 8294400 次
- 将对带有 1024 个顶点的模型(覆盖 4k 显示器的整个全屏窗口)进行照明计算:
- 可显著提高移动性能
- 简化分析。在基础通道中完成一切。
- 仅按照每顶点,而非每像素,进行照明计算
- 缺点
图 51.顶点光照渲染路径细分(全部在基础通道中)
正向渲染
图 52. 通过正向路径渲染的场景最终渲染目标
- 优点
- 通过每像素、每顶点及球谐技巧组合完成照明
- 支持实时阴影及其他每像素效果
- 不会因需要在延迟路径中构建图形缓冲区而产生内存成本
- 缺点
- 通道细分
- 基础通道
- 首先,为最亮的平行光保留每像素光线。
- 然后,绘制最多另外 3 条标记为重要的每像素光线。 如果没有标记为重要的光线,那么选择场景中的其次最亮的 3 条。如果有更多标记为重要的光线,超过了 Project->Quality 中的“per-pixel light count”设置值,那么这些在其他通道中完成。
- 接下来,每顶点渲染最多 4 条光线。
- 最后,使用球谐计算绘制剩余光线(始终计算这些值,因此本质上在 GPU 上不固定)。
- 每像素照明通道
- 半透明对象通道
- 基础通道
图 53. 通过正向路径渲染的场景最终渲染目标