Unity 是一款大多数游戏开发人员所使用的多平台游戏开发引擎,利用这个引擎可以创建和分发 2D 和 3D 游戏以及其他图形应用程序。
ARM 非常重视游戏开发人员。显然,我们现在可以在移动平台上实现游戏机品质的游戏,因此我们编写了这份面向 Unity 开发人员的 ARM 指南。本指南汇集了各种最佳实践和优化技术,可帮助您充分利用 ARM 移动平台。无论您是初学者还是高级 Unity 用户,您都能够获得在图形应用程序中提高 FPS 时所需要的建议。
泰课在线
 
优化过程
本指南首先介绍优化过程,让开发人员了解最佳质量设置和优化过程原理。其中演示了如何使用 Unity Profiler 和 Debugger 以及各种 ARM 开发工具(Mali Graphics Debugger 和 Streamline)。
首先使用性能分析器对图形应用程序进行测量,分析测量数据以找到代码中的任何瓶颈。接下来,我们确定要应用的相关优化,最后开发人员需要验证优化是否生效。
本指南专门开辟了一个章节来介绍 Mali Offline Shader Compiler,这是又一个对 Unity 开发人员非常有用的 ARM 工具,它使开发人员能够将顶点、片段和计算着色器编译为二进制形式。此外,它提供了有关每个 Mali GPU 管道中所需的着色器循环执行次数的信息,以便于开发人员针对 ARM Mali GPU 进行分析和优化。
 
优化
优化章节包括从 ARM Cortex 应用程序处理器优化(提供代码片段和设置示例)到 ARM Mali GPU 优化以及资产优化在内的各种内容。
ARM Mali GPU 优化技术包括: 
✓ 使用静态批处理,这是一项常用的优化技术,可以减少绘图调用数量,从而减少对应用程序处理器的使用。
✓ 使用 4x MSAA,ARM Mali GPU 可以实现 4x 多重采样抗锯齿 (MSAA),并且只需极低的计算开销。
泰课在线
 
LOD组设置
✓ 细节层次 (LOD),这项技术使得 Unity 引擎能够根据与摄像机的距离为同一对象渲染不同的网格。
✓ 使用光照贴图和光照探测。光照贴图预先进行光照计算,并将它们烘焙成称为光照贴图的纹理。这意味着,开发人员虽然会失去完全动态光照环境的灵活性,但他们能够获得极高质量的图像而不会影响性能。另一方面,使用光照探测,开发人员能够为光照贴图场景增加一些动态光照。光照探测越多,光照效果就越精确。
✓ ASTC 纹理压缩是可供 Unity 开发人员使用的最有效且最灵活的纹理压缩格式。它提供了高质量、低比特率以及各种各样的控制选项,这些在指南中会详细说明。
✓ Mip 贴图技术,这项技术可以提高视觉质量,并增强图形应用程序的性能。Mip 贴图是各种规格的纹理的预计算版本。生成的各个纹理称为层次,每个纹理的宽度和高度都是前一个纹理的一半。Unity 可以自动生成从原始大小的第 1 个层次一直到 1x1 像素版本在内的完整层次集合。
✓ 天空盒是使用单个立方体贴图绘制摄像机背景的方法,只需要使用一个立方体贴图纹理并执行一次绘图调用。
✓ 如何在 Unity 中高效实时地提供阴影效果。Unity 支持用于计算实时阴影的变换反馈。对于高级开发人员,本指南在“高级图形技术”一章中演示了如何使用局部立方体贴图,来通过非常高效的技术实现自定义阴影。
✓ 遮挡剔除使得当对象不在摄像机视野范围内时不渲染对象,这样可节省 GPU 处理能力。
✓ 如何高效地使用 OnBecameVisible() 和 OnBecomeInvisible() 回调。
✓ 渲染顺序对于性能而言是非常重要的。最好的方法是从前到后渲染不透明对象,这有助于减少过度绘制。开发人员会了解到,还可以利用哪些最新硬件技术来减少过度绘制,例如提前 Z 拣选和正向像素剔除 (PFK);并了解 Unity 引擎提供了哪些选项。
开发人员可以通过使用资产优化进一步优化自己的应用程序。有一个章节专门介绍这个主题,其中讲述了如何最高效地准备纹理、纹理贴图集、网格以及动画。
 
Enlighten
从第 5 版开始,Unity 引擎使用 Enlighten 来支持全局照明 (GI)。Enlighten 是 ARM Geomerics 的实时 GI 解决方案。
Unity 中的 Enlighten 可用于烘焙光照贴图和光照探测,并可以提供实时的间接光照效果。虽然 Enlighten 组件在 Unity 中未明确公开,但在用户界面中有所引用,因此本指南也介绍了这些组件的含义及其协同工作的方式。
Enlighten 相关章节还解释了如何在自定义着色器中配置 Enlighten,阐述了代码流,并且说明了开发人员在顶点和片段着色器代码中设置 Enlighten 时需要完成哪些操作。其中演示了某个版本的 Unity 标准着色器,该版本已经过修改来包括定向全局照明。
泰课在线
Enlighten 光照贴图图像:左上方 - 冰洞演示,右上方 -其 UV 图光照贴图,左下方 – 发光度光照贴图,右下方 – 方向性光照贴图
高级图形技术
第 6 章是指南中篇幅最长的一章,其中介绍了高级图形技术。这些技术主要使用“自定义着色器”实现,因为 Unity 内置着色器的源代码不提供大多数高级效果。本章首先介绍如何编写和调试自定义着色器,然后继续说明如何实现冰洞和棋牌室演示中使用的高级图形技术。其中还提供了源代码片段:
✓ 反射(使用局部立方体贴图):这项技术在 Unity 第 5 版和更高版本中使用反射探测来实现。您可以将这些反射探测与其他类型的反射结合使用,例如在运行时使用您自己的自定义着色器渲染的反射。
✓ 组合静态反射:根据局部立方体贴图将静态反射与动态生成的反射结合使用 
组合不同类型的反射 
 
动态柔和阴影
在有物体移动的游戏场景中以及房间等静态环境中使用。使用基于局部立方体贴图技术的动态柔和阴影,开发人员可以使用纹理来表示阴影,并使用 alpha 通道表示进入房间的光照量。 
✓ 折射:根据局部立方体贴图进行折射 – 这是另一项使用高度优化的局部立方体贴图技术的光照效果。开发人员可以在运行时将折射与反射结合使用。
✓ 高光效果,使用极为高效的 Blinn 技术来实现。在冰洞演示提供的示例中,使用 alpha 通道确定高光强度,确保高光效果仅应用于光照表面。
✓ 使用提前 Z 拣选,通过消除过度绘制的片段来改进性能。
✓ 脏镜头光晕效果 – 这种效果可带来戏剧般的感受,并且通常与镜头光晕效果一起使用。这可以通过耗费资源很少的简单方式实现,这种方式非常适合移动设备。
✓ 容积光 - 它们可以模拟粒子射线、大气散射或阴影的效果。它们为场景添加深度和真实感。这种效果基于截锥几何体,并通过脚本使用太阳位置计算下横截面锥形展开的幅度以及横截面移位的方向和幅度。
 
雾效果
它们可以给场景增加气氛。有两个版本的雾效果:程序线性雾和以粒子为基础的雾。
泰课在线
✓ 泛光 – 泛光效果可用于再现在明亮环境中拍摄照片时,在真实摄像机中出现的效果。这种效果在强烈的光照条件下非常醒目。本指南使用简单的平面方法以非常高效的方式演示了该效果。
✓ 冰墙效果 - 冰是难以按原样制作的材料,因为光会根据表面的微小细节以不同的方式发生散射。反射可以是完全清晰的,也可以是完全失真的,或者介于这两者之间。在冰洞演示中,这种效果融合了视差效应,因此更加逼真。
✓ 程序天空盒 - 为了实现昼夜动态效果,在冰洞演示天空盒中结合使用了以下要素:一个通过程序生成的太阳,一系列淡入淡出的天空盒背景立方体贴图(它们代表了昼夜更替),以及一个天空盒云立方体贴图。
✓ 萤火虫 – 它们是在冰洞演示中使用的发光飞行昆虫,可以增添更多的活力,并演示使用 Enlighten 提供实时全局照明的好处。

 
移动虚拟现实
最后但同样重要的是,本指南的最后一章讲述了为移动虚拟现实开发图形应用程序时的最佳代码编写实践。
Unity 本身支持一些 VR 设备,例如 Samsung Gear VR,并且可以使用各种插件来实现对 Google Cardboard 之类的其他设备的支持。本指南介绍了如何将图形应用程序移植到本机 Unity VR 上。
泰课在线
运行在 Samsung Gear VR 开发模式下的 VR 应用程序的屏幕截图
相比于从智能手机或平板电脑运行图形应用程序,VR 可以创造身临其境感更强的用户体验,因此摄像机动画可能会让 VR 用户感到不自在。此外,VR 可以受益于使用蓝牙连接到 VR 设备的控制器。本指南中介绍了打造终极用户体验的技巧和方法。
有一个完整的章节专门讨论如何在 VR 中实现反射。它们可以使用先前在“高级图形技术”一章中介绍的那种局部立方体贴图技术。不过,必须对该技术进行修改,才能与用户看到的立体视觉输出配合工作。因此,本章解释了如何实现立体反射以及将不同类型的反射结合使用。