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





0/5 (0投票)
Unity for Intel x86 平台优化指南:第 3 部分
Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员创新和取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术 和 Windows,下载工具、获取开发套件、与志同道合的开发人员分享想法,并参与黑客马拉松、竞赛、路演和本地活动。
目录
返回教程第二部分
Unity* 针对 Intel x86 平台的优化指南:第二部分
编辑器优化
遮挡剔除
遮挡剔除是 Unity 中一项可用的功能,它能根据摄像机视角,剔除被其他物体遮挡的物体。让我们以一个幻想 MMORPG 为例。如果玩家走到一座拥有广阔城市的巨大城堡前,您真的想花费系统资源来渲染城墙内所有被遮挡的商店/玩家吗?我们不这么认为。遮挡剔除就是解决方案(图 21)。
遮挡剔除通过减少整体的绘制调用次数来减轻 GPU 处理负担(如果遮挡剔除计算所需时间少于节省的驱动程序调用时间,也可能减轻 CPU 负担)。要设置遮挡剔除,了解 Unity 使用的一些术语会很有帮助,因为它们能帮助您设置场景以进行剔除。
- 遮挡物(Occluder)– 任何充当屏障并阻止可见的被遮挡物(Occludees)被渲染的物体。
- 被遮挡物(Occludees)– 任何由于被遮挡物遮挡而不会被渲染到屏幕上的物体。
您遇到的大多数物体,根据摄像机方向和游戏边界的不同,都有可能被包含为被遮挡物和遮挡物。建议检查整个场景,多选应包含在遮挡剔除计算中的所有物体,并将它们标记为“Occluder Static”(遮挡物静态)和“Occludee Static”(被遮挡物静态)。
完成添加遮挡剔除的最后一个步骤是烘焙场景。
这可以通过打开“遮挡剔除”窗口来完成,该窗口位于“窗口”>“遮挡剔除”。您将看到一个如图 20 所示的窗口,其中包含不同的烘焙技术,从“性能较高/精度较低”到“性能较低/精度较高”。您应该为您的应用程序使用“最小有效剂量”技术。
设置遮挡剔除系统时,请仔细设置您的**遮挡区域**。默认情况下,Unity 使用整个场景作为遮挡区域,这可能导致不必要的计算。为了确保不使用整个场景,请手动创建一个遮挡区域,并仅围绕需要包含在计算中的区域。
Unity 允许您可视化遮挡剔除系统的每个部分。要查看摄像机体积、可见性线和门户,只需打开遮挡剔除窗口(窗口 > 遮挡剔除)并单击“可视化”选项卡。您现在将能够在场景视图中可视化所有这些组件。
更多信息:https://docs.unity3d.org.cn/Manual/class-OcclusionArea.html
LOD:细节级别
细节级别 (LOD) 组件允许游戏对象根据物体与摄像机的距离,切换不同细节级别的网格。使用此 LOD 功能可以在对视觉保真度影响很小的情况下,极大地减少每帧的内存需求。调整 LOD 可通过在较低的 LOD 级别提供更少的几何体来减轻输入装配器和顶点着色器的负担。
您可以通过检查 Unity Profiler 来验证 LOD 功能是否实际被使用。为此,打开“CPU 使用率”剖析器,然后导航到“Camera.Render > Drawing > Culling”,并检查是否显示了“LOD.ComputeLOD”。
您还可以通过使用 GPA 捕获一帧,选择模型相应的绘制调用,然后单击“Geometry”选项卡来验证是否使用了正确的模型。这将为您提供提交的实际模型几何体的可视化表示,以及其他有用的统计数据,如顶点计数。您可以验证顶点计数是否与捕获时摄像机距离所需的模型相匹配。
细节级别通常受顶点限制。每个顶点的计算过多可能导致瓶颈。使用 Unity 着色器的移动版本可以帮助减轻每个顶点的显着计算量。当物体很小或很远时,限制 LODGroup 中的顶点计数,因为这些细节是不需要的。
阴影
阴影可能是非常重要的 GPU 性能消耗源。要查看您的阴影使用了多少系统资源,请查看 Profiler > GPU > Shadows 部分。根据您场景的布局,您可以执行各种优化来最大化阴影性能。例如,如果场景中的大部分阴影是由方向光引起的,那么减少 Project Settings > Quality 中的 Shadow Distance 设置会非常有帮助。阴影距离与片段着色器性能密切相关。在 GPA 帧捕获中,当选择一个从阴影贴图中采样(samples from the shadow map)的绘制调用时,您可以查看片段着色器执行单元的 stall / active 和 sampler read / write 指标。阴影距离值也可以在代码中动态设置。对于点光源,调整阴影分辨率有助于缓解内存带宽瓶颈,因为这在移动设备上可能非常昂贵。
以下是“Project Settings > Quality”下可用阴影选项的简要概述(有关更多信息,请查看 Unity Quality Settings 指南):
- 阴影过滤 (Shadow Filtering) – 用于过滤阴影的方法
- 硬(Hard)– 从阴影贴图中采样时,Unity 选择最近的阴影贴图像素。
- 软(Soft)– 平均多个阴影贴图像素以创建更平滑的阴影。此选项更昂贵,但创建的阴影看起来更自然。
- 阴影分辨率 (Shadow Resolution) – 生成的阴影贴图的分辨率
- 如果使用许多**点/聚光灯**,可能会显着影响性能。
- 阴影投射 (Shadow Projection) – 用于投射阴影的方法
- 稳定(Stable)– 渲染较低分辨率的阴影,当摄像机移动时不会导致晃动。
- 紧密贴合(Close Fit)– 渲染较高分辨率的阴影贴图,当摄像机移动时可能会轻微晃动。
- 阴影级联 (Shadow Cascades) – 用于级联阴影贴图的分割数量(靠近观察者的级联具有更高的分辨率以提高质量)。
- 可能显着影响**方向光**的性能。
- 阴影距离 (Shadow Distance) – 阴影可以投射的物体最大距离。
- 如果使用**方向光**,可能会显着影响片段着色器性能。
- 可以通过脚本动态更改。
性能结果会因场景以及投射/接收阴影的物体数量而异。一如既往,使用达到所需外观所需的最低质量设置非常重要。通常建议将默认阴影距离更改为较低值。
您可以通过捕获场景帧并在 GPA 帧分析器中查看来查看 Unity 生成的阴影贴图。转到最终渲染目标并导航到“Textures”选项卡以查看阴影贴图。
使用单一摄像机
有时使用多个摄像机来实现特定效果是有意义的。例如,如果您想创建视差效果,一种方法可能是使用以不同速率移动的多个摄像机。您可能没有意识到的是,每个摄像机都与一组单独的清除调用(clear calls)到图形 API 和一个新的渲染目标相关联。在一个使用了 3 个摄像机和一个 UI 摄像机(Canvas 对象需要单独的摄像机)的简单场景的帧捕获中,仅清除操作就占用了场景的 5.4%。
渲染队列排序
在图形编程中有一个称为**过绘(overdraw)**的概念,它指的是一个像素被不必要地多次重绘,从而浪费了图形资源。Unity 提供了一种定义渲染不同模型顺序的方法,称为**渲染队列 (Render Queue)** 属性。RenderQueue 属性是一个数值,可以通过 MeshRenderer 的 Material 来设置。
为了说明这有多么有利,请想象一个地板上有许多物体的场景。假设先渲染地板,它会占据屏幕的一半像素。接下来,所有物体都渲染在地板的上方。这是大量不必要的工作。在此示例中,被物体触及的任何像素都会被绘制两次。
光照贴图
光照贴图的概念是先将所有场景灯光烘焙到光照贴图中(一个包含预计算光照数据的纹理),然后由着色器为场景中的物体进行采样,而不是在着色器中动态计算光照值。当内存带宽/采样器使用不是瓶颈时,使用此技术可以带来一些显着的性能提升。Unity 提供了以这种方式将灯光烘焙到场景中的能力。
Unity 还使您能够使用**光照探针 (Light Probes)** 为动态对象生成烘焙光照数据。光照探针是您可以放置在场景中的点,它们将采样周围的光照和阴影条件。当动态对象穿过由光照探针定义的体积时,这些光照探针生成的数据将被采样。穿过物体使用的光照/阴影值将在所有相邻探针之间进行插值。场景周围放置的探针应形成一个 3D 体积,并且应在动态对象可能覆盖的区域周围更密集地分布。
要烘焙光照数据,请在 Inspector 中将所有静态几何体标记为静态(与遮挡剔除部分提到的复选框相同),并在场景周围放置光照探针以形成一个 3D 体积,覆盖光照数据将要接收的所有动态对象的潜在路径。一旦物体被标记并且光照探针被放置,通过 Window->Lighting 打开光照贴图窗口,然后单击“Bake Scene”按钮。
您将在窗口右下角看到一个小的加载条。烘焙完成后,您就完成了!您可以移除/禁用场景中不需要的所有动态灯光,但如果您的灯光在 Inspector 中被标记为“baked”(已烘焙),则不是必需的。烘焙的光照将自动应用。一种跟踪场景中仅烘焙的灯光的方法是将它们全部父级化到一个空白 GameObject 下,以便在需要重新烘焙时快速激活/停用。如果您采用此方法,请确保您的光照贴图烘焙工作流程模式未设置为自动。
使用简单的碰撞器代替复杂模型的网格碰撞器
为可以碰撞的复杂对象使用**基本碰撞器(primitive colliders)**的组合非常重要,而不是只为所有东西添加**网格碰撞器(mesh colliders)**。基本碰撞器是简单的 3D 形状(胶囊体、球体、盒子等);而网格碰撞器则采用您要为其启用碰撞的网格的形状。可能时,选择基本碰撞器而不是网格碰撞器。
继续教程第四部分
Unity* 针对 Intel x86 平台的优化指南:第四部分