65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2016 年 4 月 19 日

CPOL

10分钟阅读

viewsIcon

7025

不必要的过高分辨率纹理很容易成为移动游戏和较慢硬件的瓶颈。

英特尔®开发人员专区提供跨平台应用开发的工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发人员创新和成功。加入我们的Android物联网英特尔® RealSense™ 技术Windows社区,下载工具、访问开发套件、与志同道合的开发人员分享想法,并参与编程马拉松、竞赛、路演和本地活动。

编辑器优化

压缩纹理

过高分辨率的纹理很容易成为移动游戏和较慢硬件的瓶颈。始终值得验证您在场景中使用的纹理是否为压缩格式,并且您已选择“生成Mip贴图”复选框以启用mip贴图。Mip贴图类似于前面讨论的LOD系统,但用于纹理分辨率。如果您绘制的任何对象离摄像机非常远,则无需使用1024 x 1024纹理来获得细节,因为该对象可能只被几个像素覆盖。

图44. 在Inspector选项卡上压缩纹理并为选定纹理生成mips

您可以通过在GPA中捕获帧并在您希望调查的绘制调用的“**纹理**”选项卡中查看,来验证您的纹理是否正在被压缩以及mips是否正在生成。需要提及的是,生成mip贴图在某些情况下实际上可能会因为生成额外数据而导致性能下降。一如既往,请在您的应用程序中验证此选项。

图45. 在帧分析器中查看纹理的第4个MIP级别和格式

移动端内置着色器

在您的移动应用程序中使用内置着色器时,通常值得切换到Unity提供的移动版本对应项,以确保使用较低精度的浮点值和移动特定的优化。通过选择您的材质并在下拉菜单中找到“移动”部分(图41),在您的应用程序中尝试它们。

图46. Unity中的内置着色器

静态批处理

批处理将相似着色的几何体组合成单个绘制调用。这减少了通常伴随额外调用而产生的驱动程序开销。您可以通过选择“文件”->“构建设置”->“播放器设置”,然后勾选列出的“静态批处理”选项来开启静态批处理。Unity现在将默认启用这些设置。

图47 “其他设置”中“渲染”下的“静态和动态批处理”复选框

勾选所有不会移动的游戏对象的静态复选框。这将允许在共享相同材质的多个相似对象上使用静态批处理。

图48. 基于对象的批处理复选框
  • 请确保使用 Renderer.sharedMaterial 而非 Renderer.material,以保持材质共享。
  • 如果可能,将同一材质(漫反射、凹凸高光等)使用的多个纹理组合成一个纹理图集,以增加批处理对象的数量。

大多数情况下,静态批处理将为您的应用程序带来巨大的好处,但在某些情况下最好不要使用它。如果您需要降低内存使用量,使用静态批处理可能会不利。即使共享几何体数据的对象也必须将每个实例的顶点/索引数据副本打包到绘制调用的顶点和索引缓冲区中。Unity 提供了一个静态批处理在茂密的森林场景中可能出错的示例。在这种极端情况下,每个具有相同材质的树在发出调用之前都被打包到这些缓冲区中,这可能会导致性能问题。

动态批处理

动态批处理与静态批处理概念相同,但它批处理动态对象(移动对象)的绘制调用。

  • 动态批处理仅应用于总顶点属性少于900个的对象(可能会有变化)。
  • 接收实时阴影的对象将不会进行批处理。

HDR - 高动态范围

如果您的场景使用延迟渲染并包含HDR效果(如Bloom和Flare),通过在相机设置中勾选HDR框,您将看到绘制调用显著减少。需要注意的是,每个相机都有自己的HDR复选框。在使用DirectX 10或更高版本进行延迟渲染时,最好使用HDR。HDR与片段着色器关系最密切。如果您希望使用HDR效果,请遵循以下指南:

  • 使用延迟渲染
  • 勾选需要HDR效果的每个相机上的HDR框(图44)

图49. 相机设置中的HDR选项

选择最佳渲染路径

为您的应用程序选择最佳渲染路径高度取决于您想要实现什么。以下是Unity提供的每种渲染路径的简要概述及其优缺点。希望通过这些信息,您将能够根据您的项目具体情况选择合适的路径,但与其他优化一样,始终要对每个选项进行测试!一个很好的方法是,编写一个代码开关,通过按下一个按钮来改变渲染路径,然后通过Unity Profiler和GPA实时观察每种路径的效果,以找出哪种渲染路径最适合您的游戏。

顶点照明渲染

图50. 使用顶点照明路径渲染场景的最终渲染目标
  • 优点
    1. 仅基于每个顶点而非每个像素执行光照计算
      • 对于一个在4K显示器上覆盖整个全屏窗口、拥有1024个顶点的模型,将执行光照计算
        • 在每顶点光照方法中执行1024次
        • 在每像素光照方法中执行8294400次
    2. 可大幅提高移动设备性能
    3. 易于分析。所有操作都在基础通道中完成。
  • 缺点
    1. 不支持实时阴影和其他每像素效果
    2. 低质量照明(图..)

Vertex-lit rendering path breakdown (all in the base pass)

图51. 顶点照明渲染路径分解(全部在基础通道中)

前向渲染

图52. 使用前向路径渲染场景的最终渲染目标
  • 优点
    • 光照通过每像素、每顶点和球谐函数技术的组合完成
    • 支持实时阴影和其他每像素效果
    • 不会产生延迟路径中构建g-buffer所需的内存成本
  • 缺点
    • 如果不注意,可能会导致许多绘制调用覆盖相同的像素
  • 通道分解
    • 基础通道
      • 第一个每像素光照预留给最亮的方向光。
      • 接下来,绘制最多3个标记为重要的其他每像素光照。如果没有光照标记为重要,则选择场景中最亮的3个。如果标记为重要的光照数量超过“项目”->“质量”中的“每像素光照计数”设置值,则这些光照将在额外的通道中完成。
      • 接下来,最多4个光照以每顶点方式渲染。
      • 最后,剩余的光照使用球谐函数计算(这些值总是被计算,所以在GPU上基本上是免费的)。
    • 每像素光照通道
      • 在基础通道之后,为每个剩余的每像素光照执行额外的通道。
    • 半透明对象通道
      • 为半透明对象执行额外的通道。

图53. 使用前向路径渲染场景的最终渲染目标

延迟着色

图54. 使用延迟路径渲染场景的最终渲染目标
  • 优点
    1. 照明性能与场景复杂性无关
    2. 用大量光照计算(FLOPS)换取更多的内存使用,从而增加内存瓶颈的可能性
    3. 支持实时阴影和每像素效果
  • 缺点
    1. 不直接支持半透明渲染。这些对象通过额外的正向通道绘制。
    2. 由于g-buffer的构建,内存使用量更高
    3. 不支持抗锯齿
    4. 不支持Mesh Renderer的“接收阴影”标志
  • 通道分解
    1. G-buffer 通道
      • 渲染所有不透明对象以构建g-buffer。布局如下:
        • 渲染目标0:ARGB32 – RGB通道中的漫反射颜色和Alpha通道中的遮挡数据
        • 渲染目标1:ARGB32 – RGB通道中的镜面颜色和Alpha通道中的粗糙度
        • 渲染目标2:ARGB2101010 – RGB中的世界空间法线,Alpha通道未使用
        • 渲染目标3:ARGB32(非HDR)或ARGBHalf(HDR)– 发射、照明、光照贴图和反射探头缓冲区
        • 深度和模板缓冲区
    2. 光照通道
      • 使用 g-buffer 通道生成的纹理执行每像素光照计算。Unity 将传入几何边界体以进行 Z-test,从而轻松检测被遮挡/部分遮挡的光源。
      • 生成RGB通道包含漫反射光照值,alpha通道包含单色镜面颜色的纹理。
    3. 光照应用通道
      • 最后一个通道再次绘制所有对象,使用光照通道生成的纹理将光照应用于每个对象。
    4. 半透明对象通道
      • 需要额外的正向通道。

图55. 使用延迟路径渲染场景的最终渲染目标

*更多关于可用渲染路径的信息,请访问 https://docs.unity3d.org.cn/Manual/Rendering-Tech.html

警惕额外的正向绘制调用

如前所述,前向渲染路径将为影响几何体的每个光源发出额外的绘制调用,直到编辑器质量设置部分中所示的“**每像素光源计数**”设置。标记为重要的光源将首先用于这些调用,但如果没有标记,Unity 将选择下一个最亮的光源。在某些情况下,这可能会导致大量不必要的开销,尤其是在烘焙光源是可选的情况下。GPA捕获的以下屏幕截图显示了基本绘制以及3个额外的颜色。如果需要避免以下情况,烘焙光源或降低质量设置中的每像素光源计数可能会有益。

图56. GPA捕获显示绘制此地板所需的4个绘制调用,占场景GPU持续时间的55.3%。

图57. 在GPA中查看颜色缓冲区,了解绿色、红色和蓝色光所需的额外正向通道。

Android:分割二进制文件

最新的Unity版本能够生成胖二进制文件或将二进制文件分割成单独的ARM和x86部分。您可以使用相同的过程选择x86或ARM来测试部署的各个方面。评估压缩、代码和其他具体细节使您能够对构建进行故障排除甚至基准测试。

构建FAT APKs并不会显著增加二进制文件的大小。您可以通过简单地选择x86或ARMv7来构建精简二进制文件;但是,这将需要维护两个独立的构建。

在播放器设置中(文件>构建设置>播放器设置)

  1. 展开/打开其他设置
  2. 在“配置”中,找到“设备过滤器”并选择:“FAT (ARMv7+X86)”。见图51。
    图58. 其他设置中的配置。设备过滤器中显示三个选项。
  3. 选择“构建”(在“构建设置”屏幕上)以开始创建所选二进制文件的过程。

就是这样!您现在在您的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年的游戏开发经验,为多家公司从事游戏开发的各个方面。

© . All rights reserved.