Unity UI 优化最佳实践3 - Unity UI Profiling 工具

有几种分析工具可用于分析Unity UI的性能。 主要工具是:

  • Unity Profiler
  • Unity Frame Debugger
  • Xcode’s Instruments or Intel VTune
  • Xcode’s Frame Debugger or Intel GPA

外部工具提供毫秒(或更好)级的方法级CPU分析,以及详细的draw call和着色器分析。 设置和使用上述工具的说明超出了本指南的范围。 请注意,XCode Frame Debugger和Instruments仅适用于Apple平台的IL2CPP版本,因此目前只能用于配置iOS版本。

Unity Profiler

Unity Profiler的主要用途是执行比较分析:在Unity Profiler运行时启用和禁用UI元素可以快速定位对性能问题影响最大的UI部分。

要分析这一点,请查看Profiler输出中的Canvas.BuildBatch和Canvas.SendWillRenderCanvasases行。
Alt Text
如前所述,Canvas.BuildBatch是执行Canvas Batch构建过程的本地代码计算。

Canvas.SendWillRenderCanvases包含对注册了Canvas组件的willRenderCanvases事件的C#脚本的调用。 如前所述,Unity UI的CanvasUpdateRegistry类接收此事件并使用它来运行重建过程。 任何脏UI组件都会在这个时候更新他们的Canvas Renderer。

注意:为了更容易看到UI性能的差异,通常建议禁用除“Rendering”,“Scripts”和“UI”之外的所有跟踪类别。 这可以通过单击CPU使用情况分析器左侧的跟踪类别名称旁边的彩色框来完成。 也可以通过单击并向上或向下拖动类别的名称,在CPU分析器中对类别进行重新排序。
Alt Text
UI分类在Unity 2017.1及更高版本中是新增的。 不幸的是,部分UI更新过程没有正确分类,所以在查看UI曲线时要小心,因为它可能不包含所有与UI相关的调用。 例如,Canvas.SendWillRenderCanvas被分类为“UI”,但Canvas.BuildBatch被分类为“Others”和“Rendering”。

在2017.1及以后,还有一个新的UI Profiler。 默认情况下,该分析器是Profiler窗口中的最后一个。 它由两个时间线和批次查看器组成:
Alt Text
第一个时间线显示CPU花在两个类别上的时间,分别计算布局和渲染。请注意,它受到之前描述的相同问题的困扰,可能不会考虑某些UI功能。

第二个时间线显示批次,顶点的总数并显示事件标记。在之前的屏幕截图中,您可以看到几个按钮点击事件。这些标记可以帮助您确定导致CPU峰值的原因。

最后,UI Profiler最有用的功能是底部的批次查看器。在左边,所有Canvas都有一个树形视图,每个Canvas下面都有它们生成的批次列表。这些列提供了有关每个Canvas或批处理的有趣详细信息,但是有一个特别的信息Batch Breaking Reason,对于更好地理解如何优化UI.

该栏将显示为什么选定的批次不能与前一个合并。减少批次数是提高UI性能的最有效方法之一,因此了解什么是中断批次是很重要的。

如屏幕截图所示,最常见的原因之一是使用不同纹理或材质的UI元素。在很多情况下,这可以通过使用sprite图集很容易地解决。最后一列显示与该批次关联的游戏对象的名称。您可以双击名称以在编辑器中选择游戏对象(当您有多个具有相同名称的对象时,这非常有用)。

从Unity 2017.3开始,批次查看器只能在编辑器中运行。设备上批次通常应该是一样的,所以这仍然非常有用。如果您怀疑设备上的批次可能不同,那么您可以使用下面将要介绍的帧调试器。

Unity Frame Debugger

Unity Frame Debugger是一个有用的工具,用于减少Unity UI生成的Draw call次数。该内置工具可以通过Unity Editor中的Window菜单进行访问。启用后,它将显示Unity生成的Draw call调用,包括Unity UI生成的Draw call。

值得注意的是,帧调试器将使用生成的Draw call进行更新,以在Unity编辑器中显示游戏视图,因此可用于尝试不同的UI配置,而无需进入Play模式。

Unity UI Draw call的位置取决于要绘制的Canvas组件上选择的渲染模式:

  • Screen Space – Overlay将出现在Canvas.RenderOverlays组内
  • Screen Space – Camera将出现在所选渲染相机的Camera.Render组中,作为Render.TransparentGeometry的子组
  • World Space将作为Render.TransparentGeometry的一个子组出现在每个Canvas可见的World Space相机中

所有UI都可以通过“Shader:UI/Default”行来识别(假设UI着色器没有被自定义着色器替代)。查看下面屏幕截图中突出显示的红色框。
Alt Text

通过在调整用户界面的同时观看这组线,可以相对简单的方式来最大限度地提高Canvas将UI元素组合成批次的能力。中断批次合并最常见的原因是无意间重叠。

所有Unity UI组件都将其几何图形生成为一系列四边形。然而,许多UI Sprite或UI Text字形只占用用于表示它们的四边形的一小部分,其余为空白空间。因此,发现用户界面的设计者无意间重叠了多个不同的四边形,其纹理来自不同的材质,因此无法批量处理,这是很常见的。

由于Unity UI完全在透明队列中操作,因此任何四边形上只要覆盖这具有无法合批的四边形,它都必须在无法合批的四边形之前绘制,因此无法与放置在无法合批四边形上的其他四边形进行合批处理。

考虑三个四边形A,B和C的情况。假设所有三个四边形都相互重叠,并且还假定四边形A和C使用相同的材料,而四边形B使用单独的材料。 Quad B因此不能与A或C合批。

如果层次结构中的顺序(从上到下)是A,B,C,则A和C不能被分批处理,因为B必须绘制在A上方并在C下方。但是,如果将B置于可配合的四边形之前或之后,那么可以批量生产的四元组实际上可以合批 - B只需要在合批的四元组之前或之后绘制,而不需要插入它们。

有关此问题的进一步讨论,请参阅Canvas章节的子订单部分。

Xcode Frame Debugger & Intel GPA

(略)

Analyzing profiler results

收集分析数据后,可能会得出几个结论。如果Canvas.BuildBatch或Canvas::UpdateBatches使用了过多的CPU时间,那么可能的问题是单个Canvas上的Canvas Renderer组件数量过多。请参阅Canvas章节的“拆分Canvas”部分。

如果花费在GPU上绘制UI过量的时间,并且帧调试器指示片元着色器管道是瓶颈,则UI可能超过GPU能够达到的像素填充速率。最可能的原因是 过度的UI overdraw。请参阅填 Fill-rate, Canvases and input章节的补救填充率问题部分。

如果Graphic Rebuilds使用过多的CPU,如Canvas.SendWillRenderCanvas或Canvas::SendWillRenderCanvas使用了大部分CPU时间,则需要进行更深入的分析。图形重建过程的某些部分可能要对此负责。

在大部分的WillRenderCanvas花费在IndexedSet_Sort或CanvasUpdateRegistry_SortLayoutList中的情况下,时间花费在了对脏Layout组件的列表进行排序。考虑减少Canvas上Layout组件的数量。请参阅使用RectTransforms和Splitting Canvases部分替换布局可能修复。

如果过多的时间似乎花费在Text_OnPopulateMesh中,那么罪魁祸首就是文本网格的生成。请参阅Best Fit and Disabling Canvases 部分以了解可能的补救措施,如果大部分重新构建的文本实际上并未更改其基础字符串数据,请考虑分割Canvas中的建议。

如果在Shadow_ModifyMesh或Outline_ModifyMesh(或ModifyMesh的任何其他实现)内使用了时间,则问题是计算网格修改器花费的时间过长。考虑删除这些组件并通过静态图像实现其视觉效果。

如果Canvas.SendWillRenderCanvas中没有特定的热点,或者它看起来每帧都在运行,那么问题可能是动态元素与静态元素组合在一起,并且迫使整个Canvas过于频繁地重建。请参阅拆分Canvas部分。

翻译自:https://unity3d.com/cn/learn/tutorials/topics/best-practices/unity-ui-profiling-tools?playlist=30089

Pingbacks are open.

Trackback URL

Comments

2 Comments

  • Karinaviefs
    29 Jun 2019, 04:52 | Reply
    beb9 islieferanten kanada is from canada daily
  • XRumerTest
    04 Jul 2019, 21:36 | Reply
    Hello. And Bye.
Post your comment

cancel reply