目录
返回至教程第 3 部分:
不必要的高分辨率纹理很容易成为移动游戏中的瓶颈,造成硬件效率降低。
因此,您不仅需要确认场景中所用纹理是否采用压缩格式,而且还需要核实您已经选中 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 效果的场景(例如爆炸和燃烧),那么通过勾选 Camera 设置中的 HDR
选框,您将发现绘制调用大幅减少。 需要注意的是,每个摄像头都有其自己的 HDR 复选框。 在使用带有延迟渲染的 DirectX 10
或更高版本时,最好使用 HDR。 HDR 与片段着色器之间有着最紧密的关联。 如果您想要使用 HDR 效果,那么请遵循以下准则:
使用延迟渲染
针对需要 HDR 产生效果的各摄像头,勾选 HDR 选框(图 44)
图 49.Camera 设置中的 HDR 选项
为您的应用选择最佳渲染路径在很大程度上依赖于您想要完成什么工作。以下内容简要概述了 Unity
提供的各个渲染路径及其优劣。希望通过这些信息,您能够了解根据您项目的具体情况,您应选择哪种路径,但与其余这些优化一样,始终需要对各个选项进行测
试! 了解哪种渲染路径最适合您的游戏的绝佳方式是使用代码编写一个开关。您只需按下开关按钮即可改变渲染路径,然后通过 Unity 分析器和 GPA
实时观察每个路径的效果。
顶点光照渲染
图 50.通过顶点光照路径渲染的场景最终渲染目标
优点
仅按照每顶点,而非每像素,进行照明计算
将对带有 1024 个顶点的模型(覆盖 4k 显示器的整个全屏窗口)进行照明计算:
使用每顶点照明方法,计算 1024 次
使用每像素照明方法,计算 8294400 次
可显著提高移动性能
简化分析。在基础通道中完成一切。
缺点
不支持实时阴影及其他每像素效果
低质量照明(图……)
图 51.顶点光照渲染路径细分(全部在基础通道中)
正向渲染
图 52.通过正向路径渲染的场景最终渲染目标
优点
通过每像素、每顶点及球谐技巧组合完成照明
支持实时阴影及其他每像素效果
不会因需要在延迟路径中构建图形缓冲区而产生内存成本
缺点
如果不注意的话,将造成许多涵盖相同像素的绘制调用
通道细分
基础通道
首先,为最亮的平行光保留每像素光线。
然后,绘制最多另外 3 条标记为重要的每像素光线。 如果没有标记为重要的光线,那么选择场景中的其次最亮的 3
条。如果有更多标记为重要的光线,超过了 Project->Quality 中的“per-pixel light
count”设置值,那么这些在其他通道中完成。
接下来,每顶点渲染最多 4 条光线。
最后,使用球谐计算绘制剩余光线(始终计算这些值,因此本质上在 GPU 上不固定)。
每像素照明通道
适用于基础通道处理后所剩各条每像素光线的另一通道。
半透明对象通道
适用于半透明对象的另一通道。
图 53.通过正向路径渲染的场景最终渲染目标
延迟着色
图 54.通过延迟路径渲染的场景最终渲染目标
优点
照明效果与场景复杂度无关
用很有可能受到内存限制的更高内存使用量换取大量照明计算 (FLOPS)
支持实时阴影和每像素效果
缺点
不直接支持半透明渲染。 这些对象可通过一条额外的正向通道进行绘制
因构建图形缓冲区而造成内存使用量提高
不支持抗锯齿
不支持网格渲染器的接收阴影标记
通道细分
图形缓冲区通道
渲染所有不透明的对象,以构建图形缓冲区。布局如下:
渲染目标 0: ARGB32 – RGB 通道中的漫射颜色和阿尔法通道中的遮挡数据
渲染目标 1: ARGB32 – RGB 通道中的高光颜色和阿尔法通道中的粗糙度
渲染目标 2: ARGB2101010 – RGB 通道中世界空间是常态,阿尔法通道未使用
渲染目标 3: ARGB32(非 HDR)或 ARGBHalf (HDR) – 发射、照明、光照映射及反射探测缓冲区
深度及模板缓冲区
照明通道
使用图形缓冲区通道生成的纹理进行每像素照明计算。 Unity 将对几何包围盒进行 Z 测试,支持轻松检测遮挡/部分遮挡光线。
通过保存漫射照明值的 RGB 通道产生纹理,阿尔法通道包含高光单色。
光线应用通道
最后的通道再次绘制所有对象,使用照明通道生成的纹理将照明应用到每个对象。
半透明对象通道
需要额外的正向通道。
图 55.通过延迟路径渲染的场景最终渲染目标
如前所述,正向渲染路径将根据编辑器质量设置部分下显示的“Per-Pixel Light Count”设置,对影响您几何图形的各条光线发出额外的绘制调用。标记为重要的光线将首先用在这些调用中,但如果没有重要标记光线,那么 Unity 将选择其次最亮的光线。 在有些情况下,这可能造成大量不必要的开销,尤其是可选择合并光线时。以下 GPA 捕获截图显示了基础绘制及另外 3 种颜色。如果需要避免以下情况,最好合并光线或在质量设置中减少每像素光线数量。
图 56.GPA 捕获显示描绘这一占用 55.3% 的场景 GPU 持续时间的地面需要 4 个绘制调用。
图 57.对于绿、红、蓝光线所需的额外正向通道,查看 GPA 中的颜色缓冲区。
最新 Unity 版本能够产生一个胖二进制,或将该二进制拆分成单独的 ARM 和 x86 部分。 您可使用同一流程选择 x86 或 ARM,以测试部署的各个方面。 评估压缩、代码及其他细节支持您排除故障,甚至对您的构建项目进行基准测试。
构建 FAT APK 不会显著增加二进制大小。 您只需选择 x86 或 ARMv7 即可构建瘦二进制;但必须维持 2 个单独的构建项目。
在 Player 设置中 (File>Build Settings > Player Settings):
打开/扩展其他设置
在 Configuration 中,找到 Device Filter 并选择: FAT (ARMv7+X86)。 参见图 51。
图 58.Other Settings 中的 Configuration。 Device Filter 中所示 3 个选项。
选择构建(在 Build Settings 界面上),开始创建选定二进制的流程。
就这么简单! 您现可在 Unity Android 游戏部署中支持 x86。
面向 Unity x86 开发人员的页面现已上线:www.intel.com/software/unity,点击获取更多支持。
优化工作本身有助于提高您图形密集型游戏的性能。以上技巧的组合可帮助您大展拳脚。使用这些工具能够让您获得更深入的了解,并进一步作出调整。