如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能。 在本指南中,我们将展示 Unity*
软件中的多种工具和特性,以帮助您增强 Unity 项目的性能。 我们将介绍如何处理纹理质量、批处理、标压缩、光烘烤和 HDR 效果。
在本指南结束之际,您将能够了解 Unity 中的性能问题及其成因、关键优化和有助于开发优秀游戏的方法。 首先我们来看看有助于轻松识别应用中潜在热点的工具。
在本指南中,我们将探讨三种主要工具: Unity 分析器、GPA 系统分析器和 GPA 帧分析器。 每种工具本身都拥有强大的游戏开发功能。 如果您能够组合使用所有三种工具,您将会在游戏简化和优化方面取得显著成效。
图 1.Unity 分析器主屏幕
Unity 分析器(图 1)是 Unity 中一个极其强大的工具,它可帮助您识别项目中各种子系统的问题。
分析器图形部分拥有不同的子分析器,后者可显示面向特定硬件的指标。 当前可用的子分析器包含 CPU 使用、GPU 使用、渲染、内存、音频、物理和
2D 物理等指标。 每个子分析器都可进一步划分为相关组件部分,可将这些部分相分离以深入了解细节。 例如,CPU
使用包含渲染、脚本、物理、垃圾收集器、垂直同步和其他部分。
图形部分下方是概览窗口,在此窗口中您可以看到一个指标列表,包括面向各种 Unity 子系统的计时信息和内存分配。 从渲染到垃圾收集,一切都在此显示,最好能检查下应用中优化耗时最长的部分。 单击图形的任何部分都会暂停分析器更新,让您研究突出显示的帧。
Unity 分析器可连接到编辑器或独立构件中的运行应用。 如要获得最准确的计时以避免编辑器开销,建议您不时地连接到独立构件。
具体操作是:点击窗口顶部的 ‘Active Profiler’ 按钮,从 ‘Android Player’
的可用实例以及网络上的任何内容进行选择,可通过 ADB (Android Debug Bridge) 检测可用实例。
另一个选项是“深入分析”应用。 不建议将该选项用于一般用途,因为它会实际使用所有单代码,这样会造成大量的分析开销。 幸运的是,Unity 能够直接使用您感兴趣的任何代码段。图 2 展示了如何利用代码,以便无论您提供何种标签,它都会显示在分析器上:
图 2.在 Profiler 中设置可供使用的代码段
图 3.GPA 系统分析器实时视图
英特尔® 图形性能分析器(英特尔® GPA) 是一套图形分析和优化工具,可帮助游戏开发人员加快游戏和其他图形密集型应用的运行速度。 英特尔® GPA 提供了广泛的功能,支持开发人员深入分析图形 API 调用以确定主要性能问题的原因。 本指南介绍的许多实验和指标都来自英特尔® GPA。 英特尔® GPA 支持您研究 DirectX* 应用在 Windows* 上的图形工作负载以及 OpenGL ES* 应用在部分运行 Android 的英特尔® 处理器系统上的图形工作负载。 尽管它无法直接监控 OpenGL* API 调用,但是在 OpenGL 游戏运行期间,您仍能够使用 GPA 系统分析器来研究 GPU 和 CPU 指标。 无论图形 API 如何,您都可以使用 GPA 平台分析器来查看详细的 CPU 负载,包括任何 OpenCL 活动。 如要查看更多详情,英特尔® GPA 可为您提供 API 来添加自己的工具。 GPA 工具集适用于 Android 和桌面,如欲了解更多信息并下载英特尔® GPA,请登录:www.intel.com/software/GPA/
第一步,使用英特尔® GPA 收集实时性能信息。 英特尔® GPA 拥有两种不同的实时数据显示模式(如上所示): 在应用顶层运行的平视显示器 (HUD),以及通过网络连接到测试系统的系统分析器。 两种工具都可以显示来自 DirectX 管线(一些英特尔® 处理器上的 OpenGL ES 管线)的指标、CPU 利用率和系统电源。 在受支持的英特尔® 处理器图形系统上,您也可以获得大量的 GPU 硬件指标。 HUD 和系统分析器提供了简单的实验,可帮助您快速检测性能问题。 请参见英特尔 GPA 文档,了解有关 HUD 与系统分析器特性和功能的更多详情。
图 4.GPA 系统分析器备用 HUD
如要把指标值添加到分析中,只需将其从左侧栏拖到主图形区域。 这些工具能够在 ARM* 设备上运行,但是在基于英特尔® 处理器的硬件上并非拥有所有指标。 更多信息,请参见面向Windows和OS XGPA 教程。以下各组指标在英特尔® 硬件上提供:
CPU
设备 IO
执行单元
片段着色器
GPU
输入-装配器
内存
OpenGL/DX
状态指标
输出-合成器
功耗
光栅器
顶点着色器
就 CPU 瓶颈而言,您可能会发现平台分析器可用于 DirectX 和 OpenGL。 它显示了所捕获的 CPU 活动痕迹。
如果想为代码添加工具,您可以将在 CPU 上运行的单个任务相关联,并通过 DirectX 观察它们的进程,驱动程序以及 GPU。
为了帮助您确定瓶颈,GPU 中包含了一个“状态覆盖”部分(图 5),支持您开展实验,检查在不断变化的条件下的帧率浮动。 几个示例:
图 5.可用覆盖
纹理 2x2
从高分辨率纹理中提取数据的成本十分高昂。 这将使用 2x2 纹理取代场景中所用的全部纹理。 通过勾选这一选项所导致的显著性能变化显示,可以缩小一些纹理的尺寸来提高帧率。
空硬件
这将模拟一个无限快的 GPU。如果这能够增加帧率,您的代码就可能会与驱动程序或 CPU 相绑定。
禁用绘制调用
这将会模拟一个非常快的驱动程序,如果帧率浮动,则表示您的代码可能与驱动程序相绑定。
简单的片段着色器
这将使用一个非常简单的片段着色器取代所有着色器。浮动可能表示着色器应针对性能提升进行优化。
实验部分下方是平台设置滑块。 该特性支持您以不同的频率运行 CPU。 这可帮助确定瓶颈,即使您的游戏/应用正在任何测试设备上以最大帧率运行。 这也可被用于验证您的游戏/应用是否能在广泛的设备上运行。CPU 频率滑块的另一大用途是强制施加特定频率,以防止英特尔® 睿频加速等技术导致测试结果出现偏差。
最后,您可以点击窗口顶部的相机图标来捕获帧。 随后,系统分析器会记录用于制作游戏/应用单帧的每个细节(状态更改、时间、纹理等)。 可使用帧分析器工具打开存储这一信息的文件,以进行深入研究。
图 6.GPA 帧分析器显示变更记录和相关帧信息
帧分析器工具(图 5)支持您打开单帧捕获。 捕获的帧将包含对所有状态变更、资源、定时信息等的记录。
窗口顶部的图形显示了在帧中所记录的每个绘制调用。 为方便可视化,这些绘制调用按照渲染目标进行分离。 图形中的 X 和 Y
值可通过左上方的下拉菜单进行更改。 左侧是单独渲染目标列表。 左下方显示了当前突出显示的绘制调用的预览以及它们在帧上的出现方式。
您可以通过各种选项对视图进行自定义,包括突出显示绘制的像素或保持它们正常。 您也可以选择调整未选定对象对预览的影响方式(隐藏或不隐藏)。
右下角是选项卡集,这些选项卡可提供有关当前所选绘制调用的更多洞察,包括:
帧概述
在面向整个帧的 GPU 管线中按阶段细分的计时/状态值
图 7.帧概述部分的报告值
详细信息
在面向图形/树中当前所选绘制调用的 GPU 管线中按阶段细分的计时/状态值
纹理(下图 8)
当前绑定的纹理列表
纹理选项卡下方的左侧栏可用于验证压缩、格式、mip 层等。
图 8.少数绘制调用所用纹理的视图
状态
面向选定绘制调用的状态设置
可以进行编辑,以查看对渲染目标预览和计时的影响
着色器
这一部分将向您介绍选定绘制调用所用的着色器。
您可以编辑着色器代码,并查看这些变更如何在视觉上影响场景预览。着色器代码变更也会体现在定时变更上,因此您可以看到多少特定优化正在影响帧时间。
图 9.编辑着色器以输出硬编码绿色值,将绘制调用速度加快 57.7%
实验
与系统分析器的实验部分相似,但可以按绘制调用使用。
图 10.实验展示了替代 2x2 纹理如何将绘制调用速度加快 5.9%。 在 Details 选项卡可以看到图形管线上各点的变更。
几何
该选项卡显示了窗口中面向选定绘制调用的几何数据 3D 表示。
图 11.查看 Geometry 选项卡中的几何模型
API 日志
显示面向选定绘制调用的所有 API 调用。 这对于跟踪可能会影响性能的不必要状态变更大有帮助。