Unity for Intel x86 平台优化指南:第 4 部分





5.00/5 (1投票)
不必要的过高分辨率纹理很容易成为移动游戏和较慢硬件的瓶颈。
英特尔®开发人员专区提供跨平台应用开发的工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发人员创新和成功。加入我们的Android、物联网、英特尔® RealSense™ 技术和Windows社区,下载工具、访问开发套件、与志同道合的开发人员分享想法,并参与编程马拉松、竞赛、路演和本地活动。
编辑器优化
压缩纹理
过高分辨率的纹理很容易成为移动游戏和较慢硬件的瓶颈。始终值得验证您在场景中使用的纹理是否为压缩格式,并且您已选择“生成Mip贴图”复选框以启用mip贴图。Mip贴图类似于前面讨论的LOD系统,但用于纹理分辨率。如果您绘制的任何对象离摄像机非常远,则无需使用1024 x 1024纹理来获得细节,因为该对象可能只被几个像素覆盖。
您可以通过在GPA中捕获帧并在您希望调查的绘制调用的“**纹理**”选项卡中查看,来验证您的纹理是否正在被压缩以及mips是否正在生成。需要提及的是,生成mip贴图在某些情况下实际上可能会因为生成额外数据而导致性能下降。一如既往,请在您的应用程序中验证此选项。
移动端内置着色器
在您的移动应用程序中使用内置着色器时,通常值得切换到Unity提供的移动版本对应项,以确保使用较低精度的浮点值和移动特定的优化。通过选择您的材质并在下拉菜单中找到“移动”部分(图41),在您的应用程序中尝试它们。
静态批处理
批处理将相似着色的几何体组合成单个绘制调用。这减少了通常伴随额外调用而产生的驱动程序开销。您可以通过选择“文件”->“构建设置”->“播放器设置”,然后勾选列出的“静态批处理”选项来开启静态批处理。Unity现在将默认启用这些设置。
勾选所有不会移动的游戏对象的静态复选框。这将允许在共享相同材质的多个相似对象上使用静态批处理。
- 请确保使用 Renderer.sharedMaterial 而非 Renderer.material,以保持材质共享。
- 如果可能,将同一材质(漫反射、凹凸高光等)使用的多个纹理组合成一个纹理图集,以增加批处理对象的数量。
大多数情况下,静态批处理将为您的应用程序带来巨大的好处,但在某些情况下最好不要使用它。如果您需要降低内存使用量,使用静态批处理可能会不利。即使共享几何体数据的对象也必须将每个实例的顶点/索引数据副本打包到绘制调用的顶点和索引缓冲区中。Unity 提供了一个静态批处理在茂密的森林场景中可能出错的示例。在这种极端情况下,每个具有相同材质的树在发出调用之前都被打包到这些缓冲区中,这可能会导致性能问题。
动态批处理
动态批处理与静态批处理概念相同,但它批处理动态对象(移动对象)的绘制调用。
- 动态批处理仅应用于总顶点属性少于900个的对象(可能会有变化)。
- 接收实时阴影的对象将不会进行批处理。
HDR - 高动态范围
如果您的场景使用延迟渲染并包含HDR效果(如Bloom和Flare),通过在相机设置中勾选HDR框,您将看到绘制调用显著减少。需要注意的是,每个相机都有自己的HDR复选框。在使用DirectX 10或更高版本进行延迟渲染时,最好使用HDR。HDR与片段着色器关系最密切。如果您希望使用HDR效果,请遵循以下指南:
- 使用延迟渲染
- 勾选需要HDR效果的每个相机上的HDR框(图44)
选择最佳渲染路径
为您的应用程序选择最佳渲染路径高度取决于您想要实现什么。以下是Unity提供的每种渲染路径的简要概述及其优缺点。希望通过这些信息,您将能够根据您的项目具体情况选择合适的路径,但与其他优化一样,始终要对每个选项进行测试!一个很好的方法是,编写一个代码开关,通过按下一个按钮来改变渲染路径,然后通过Unity Profiler和GPA实时观察每种路径的效果,以找出哪种渲染路径最适合您的游戏。
顶点照明渲染
- 优点
- 仅基于每个顶点而非每个像素执行光照计算
- 对于一个在4K显示器上覆盖整个全屏窗口、拥有1024个顶点的模型,将执行光照计算
- 在每顶点光照方法中执行1024次
- 在每像素光照方法中执行8294400次
- 对于一个在4K显示器上覆盖整个全屏窗口、拥有1024个顶点的模型,将执行光照计算
- 可大幅提高移动设备性能
- 易于分析。所有操作都在基础通道中完成。
- 仅基于每个顶点而非每个像素执行光照计算
- 缺点
- 不支持实时阴影和其他每像素效果
- 低质量照明(图..)
前向渲染
- 优点
- 光照通过每像素、每顶点和球谐函数技术的组合完成
- 支持实时阴影和其他每像素效果
- 不会产生延迟路径中构建g-buffer所需的内存成本
- 缺点
- 如果不注意,可能会导致许多绘制调用覆盖相同的像素
- 通道分解
- 基础通道
- 第一个每像素光照预留给最亮的方向光。
- 接下来,绘制最多3个标记为重要的其他每像素光照。如果没有光照标记为重要,则选择场景中最亮的3个。如果标记为重要的光照数量超过“项目”->“质量”中的“每像素光照计数”设置值,则这些光照将在额外的通道中完成。
- 接下来,最多4个光照以每顶点方式渲染。
- 最后,剩余的光照使用球谐函数计算(这些值总是被计算,所以在GPU上基本上是免费的)。
- 每像素光照通道
- 在基础通道之后,为每个剩余的每像素光照执行额外的通道。
- 半透明对象通道
- 为半透明对象执行额外的通道。
- 基础通道
延迟着色
- 优点
- 照明性能与场景复杂性无关
- 用大量光照计算(FLOPS)换取更多的内存使用,从而增加内存瓶颈的可能性
- 支持实时阴影和每像素效果
- 缺点
- 不直接支持半透明渲染。这些对象通过额外的正向通道绘制。
- 由于g-buffer的构建,内存使用量更高
- 不支持抗锯齿
- 不支持Mesh Renderer的“接收阴影”标志
- 通道分解
- G-buffer 通道
- 渲染所有不透明对象以构建g-buffer。布局如下:
- 渲染目标0:ARGB32 – RGB通道中的漫反射颜色和Alpha通道中的遮挡数据
- 渲染目标1:ARGB32 – RGB通道中的镜面颜色和Alpha通道中的粗糙度
- 渲染目标2:ARGB2101010 – RGB中的世界空间法线,Alpha通道未使用
- 渲染目标3:ARGB32(非HDR)或ARGBHalf(HDR)– 发射、照明、光照贴图和反射探头缓冲区
- 深度和模板缓冲区
- 渲染所有不透明对象以构建g-buffer。布局如下:
- 光照通道
- 使用 g-buffer 通道生成的纹理执行每像素光照计算。Unity 将传入几何边界体以进行 Z-test,从而轻松检测被遮挡/部分遮挡的光源。
- 生成RGB通道包含漫反射光照值,alpha通道包含单色镜面颜色的纹理。
- 光照应用通道
- 最后一个通道再次绘制所有对象,使用光照通道生成的纹理将光照应用于每个对象。
- 半透明对象通道
- 需要额外的正向通道。
- G-buffer 通道
*更多关于可用渲染路径的信息,请访问 https://docs.unity3d.org.cn/Manual/Rendering-Tech.html
警惕额外的正向绘制调用
如前所述,前向渲染路径将为影响几何体的每个光源发出额外的绘制调用,直到编辑器质量设置部分中所示的“**每像素光源计数**”设置。标记为重要的光源将首先用于这些调用,但如果没有标记,Unity 将选择下一个最亮的光源。在某些情况下,这可能会导致大量不必要的开销,尤其是在烘焙光源是可选的情况下。GPA捕获的以下屏幕截图显示了基本绘制以及3个额外的颜色。如果需要避免以下情况,烘焙光源或降低质量设置中的每像素光源计数可能会有益。
Android:分割二进制文件
最新的Unity版本能够生成胖二进制文件或将二进制文件分割成单独的ARM和x86部分。您可以使用相同的过程选择x86或ARM来测试部署的各个方面。评估压缩、代码和其他具体细节使您能够对构建进行故障排除甚至基准测试。
构建FAT APKs并不会显著增加二进制文件的大小。您可以通过简单地选择x86或ARMv7来构建精简二进制文件;但是,这将需要维护两个独立的构建。
在播放器设置中(文件>构建设置>播放器设置)
- 展开/打开其他设置
- 在“配置”中,找到“设备过滤器”并选择:“FAT (ARMv7+X86)”。见图51。
图58. 其他设置中的配置。设备过滤器中显示三个选项。 - 选择“构建”(在“构建设置”屏幕上)以开始创建所选二进制文件的过程。
就是这样!您现在在您的Unity Android游戏部署中支持x86了。
一个专门的Unity x86开发者页面可在 www.intel.com/software/unity 获得额外支持。
结论
优化本身就是一项工作,旨在从图形密集型游戏中获得高水平的性能。结合上述技术可以帮助您取得显著进展。使用这些工具将使您能够更深入地进行调整。
资源
减少纹理和大小:https://docs.unity3d.org.cn/Manual/ReducingFilesize.html
阴影:https://docs.unity3d.org.cn/Manual/Shadows.html
关于作者
Cristiano Ferreira是英特尔开发者关系部门的软件工程师,专注于游戏和图形。Cristiano帮助游戏开发者在英特尔硬件上为客户提供最佳体验。
Steve Hughes是英特尔高级应用工程师,专注于支持从台式机、平板电脑到手机的x86平台游戏开发。在加入英特尔之前,Steve拥有12年的游戏开发经验,为多家公司从事游戏开发的各个方面。