obsidian/笔记文件/2.笔记/Unity性能优化_第七章.md
2025-03-26 00:02:56 +08:00

11 KiB
Raw Permalink Blame History

Unity Profile Analyzer窗口

Profile Analyzer配合Profiler使用。当我们使用Profiler收集了数据之后不要关闭Profiler并且打开Profile Analyzer把Profiler收集的数据导入到Profile Analyzer使用Profile Analyzer可以帮助我们选出一段数据中最具有代表性的一帧方便我们进行性能分析。也能看出收集的数据整体的一些情况例如中位数、平均值、最大值、最小值等。

Profile Analyzer也可以比较两段数据的性能开销。

打开方法Window——Analysis——Profile Analyzer

官方文档:https://docs.unity3d.com/Packages/com.unity.performance.profile-analyzer@1.2/manual/index.html

Profile Analyzer要配合Profiler使用点击Open Profiler Window可以打开Profiler此时Open Profiler Window会变成Close Profiler Window点击Close Profiler Window会关闭打开的Profiler

左上方的Mode有两种模式选择Single会分析一段数据选择Compare会分析两段数据可以对这两段数据作对比。

左上方的Export可以把分析的结果导出到本地以便我们查看。

在Profiler收集了一段数据之后可以点击Profile Analyzer中的Pull Data这样就会导入那段数据到Profile Analyzer方便我们分析。点击Save则会把数据保存到本地点击Load则可以从本地载入数据。

在上方的图表中我们可以拖选其中的一段数据然后在下方的Top 10 markers on median frame下看到最具有代表性的一帧点击它则profiler窗口中也会自动选中那一帧。

Top 10 markers on median frame下方右侧是10个最具有代表性的Marker。

Marker表示代码的标记。Unity执行的一些关键的方法或者一段关键的代码会被标记方便我们查看这些方法和代码的性能。

此时在下方的Marker Details for current selected range下方可以看到选中的这段数据的信息。

    Filters的选项用于对数据进行筛选。
    Name Filter表示筛选含有指定字符串的结果。
    Exclude Names表示筛选不含有指定字符串的结果。
    Thread表示筛选指定线程的结果
    Depth Slice表示筛选指定调用栈的深度。
    点击Analyze则会根据Filters的选项的设置重新进行分析可以在下方的Marker Details for currently selected range的下方看到结果。

Unity Profiler性能分析器

Profiler窗口就是性能分析器的窗口用来详细分析游戏性能。

打开Profiler窗口的方法 1、Window——Analysis——Profiler 2、Ctrl+7

使用性能分析器进行分析时其自身也是会消耗性能的。如果想获得更加准确的数据可以使用独立性能分析器即Profiler(Standalone Process)。

打开Profiler(Standalone Process)窗口的方法: Window——Analysis——Profiler(Standalone Process)

独立性能分析器的运行不会影响收集的数据因此可以获得更加准确的数据。它的用法和Profiler窗口相同但是启动它的时间比打开Profiler窗口的时间长。

打开Profiler窗口后运行Unity再点击Profiler窗口上方的圆形按钮就会开始收集当前开始的每一帧的性能再点一下那个圆形按钮则会停止收集此时就可以双击右上部分的一个位置选中一帧然后看这一帧的情况一般我们可以选择波峰的一帧这样容易看出性能开销大的原因。也可以推动时间轴或者点击上方圆形按钮右侧的三个按钮查看其它帧的情况。上方的Frame表示当前正在查看的帧数以及收集的总帧数例如Frame:738/963表示一共收集了963帧当前查看的是第738帧。

每一项左侧的颜色方块表示该项是显示的,如果点击颜色方块,则右侧会隐藏该项的数据。

如果不要显示某个模块的数据可以点击左上角的“Profiler Modules”取消勾选它这样在性能分析器收集数据的时候也不会收集这些数据可以减少性能分析器的开销。如果要重新显示某个模块的数据则勾选它即可。点击Restore Defaults会恢复默认的设置。点击小齿轮再点击Add可以自定义一个新的模块并自定义这个模块要分析的性能且可以在上方的输入框处改名然后点击Save Changes可以保存。如果要删除它则点击Delete Module即可删除它同样点击Save Changes可以保存。

如果要清除当前收集的所有帧的数据则可以点击上方的“Clear”。再次点击Profiler窗口上方的圆形按钮就会开始收集当前开始的每一帧的性能再点一下那个圆形按钮则会停止收集此时就可以双击右上部分的一个位置选中一帧然后看这一帧的情况。

选中一帧后,除了可以在右侧看到这一帧的情况,还可以在下方看到这一帧更加具体的情况。

要找出造成性能开销的因素,可以尝试禁用场景中的游戏对象。如果禁用后,看到性能提升了,则说明问题出在这个游戏对象身上,优化的时候就可以从它身上下手。

    点击圆形按钮左侧的下拉菜单可以选择分析什么的性能。如果选择Play Mode则会分析游戏在运行时的性能如果选择Edit Mode则会分析编辑器模式下游戏的性能。
    如果用手机的数据线成功连接到电脑在手机上运行Unity的游戏这里会多出该手机设备供我们选择我们就可以分析该手机设备上运行的Unity项目的性能。
    也可以让手机和电脑都连接同一个wifi这样一来这里也会多出该手机设备供我们选择我们就可以分析该手机设备上运行的Unity项目的性能。
    注意无论是用wifi还是数据线构建项目时必须在Build Settings窗口中勾选Development Build和Autoconnect Profiler。

选择上方的Clear on Play则在每次重新运行游戏的时候都会清空收集的数据以便我们重新开始收集这一次的数据。

如果要保存收集到的数据到本地,方便之后查看,可以点击右上方的图标来保存。右上方也有一个图标可以读取之前保存的数据。

    选择上方的Deep Profile然后重新启动性能分析器则性能分析器收集数据的时候会把所有C#代码中的方法的信息也收集过来。例如我们自己写的C#脚本里面的方法只要被调用了就会被收集过来方便我们从性能分析器查看它们的性能。在Profiler窗口选择CPU Usage模块选中一帧然后在下面选择Hierarchy右侧选择Main Thread再在右侧的搜索栏处搜索该方法的名字就可以找到它并查看它的性能。
    注意使用Deep Profile会耗费较大的性能可能会导致性能分析器的运行变慢。小项目这样做是可以的但是如果项目较大这样做可能会导致性能分析器运行过慢。如果要分析某一段代码的性能可以使用Profiler.BeginSample方法和Profiler.EndSample方法。

    选中Deep Profile右侧的Call Stacks按钮这样在收集性能数据的时候每一帧都会记录该方法的的调用栈信息。GC.Alloc、UnsafeUtility.Malloc、JobHandle.Complete是Unity的方法启用Call Stacks且勾选它们后如果Unity有调用它们则可以在Hierarchy或Raw Hierarchy右侧的搜索框中搜索到它们这样就可以查看它们的性能了。
    GC.Alloc表示GC的内存分配情况。
    UnsafeUtility.Malloc(Persistent)用于在内存中分配指定大小的未初始化内存块。这个方法会直接在堆上分配内存并可以绕过自动内存管理功能需要手动管理内存的生命周期和释放。一般情况下只有在处理非托管内存的特定场景下才会使用UnsafeUtility.Malloc方法。
    JobHandle.Complete表示Job的完成情况。这里的Job是指Unity的Job System的一组特定的任务。

点击右上角的三点,有一些选项可以选择。 Color Blind Mode表示色盲模式开启后会调整Profile窗口的颜色照顾色盲用户。 Show Stats for 'current frame'开启后当点击Frame:XXX/XXX左侧的按钮从而选中最后一帧则会显示最后一帧的统计信息。 Preferences点击后会打开Project Settings窗口用于设置性能分析器的一些属性。 Frame Count开始收集性能的数据时每次最多可以查看多少帧。例如数值是300则表示最多可以查看300帧。 Show Stats for 'current frame'勾选后则在右上角的三点会出现Show Stats for 'current frame'供我们选择。 Default recording state选择Enable则重启Unity再打开Profiler窗口如果此时的模式是Edit Mode则会自动开始点击圆形按钮开始收集数据。选择Disabled则重启Unity再打开Profiler窗口需要手动点击圆形按钮才会开始收集数据。选择Remember则会按照当前圆形按钮是启用还是禁用来决定下一次重启Unity再打开Profiler窗口时该圆形按钮是否启用。 Default editor target mode on start选择Play Mode则重启Unity再打开Profiler窗口左上方会选择Play Mode即在播放模式下才会收集数据。如果选择Edit Mode则重启Unity再打开Profiler窗口左上方会选择Edit Mode即在编辑器模式下收集数据。 Custom connection ID当有多个Unity项目的实例同时运行它们都要使用性能分析器来分析性能则可以通过这个Custom connection ID来区分它们。

CPU Usage模块 下方窗口可以选择Timeline、Hierarchy、Raw Hierarchy。 选择Timeline可以通过时间轴的方式查看这一帧中CPU依次干了什么。 选择Hierarchy可以查看CPU在这一帧中做的事情所消耗的性能和所花费的时间。Total表示一共占用了CPU使用情况的百分之几。Self表示自身的代码占用了CPU使用情况的百分之几调用其它方法的代码不算在内的。Calls表示被调用了几次。GC Alloc表示GC分配的内存当一个对象被释放后它GC分配的内存不会马上被回收所有GC分配的内存的总量达到一定程度会触发GC此时垃圾回收器才会把这些内存回收不过同时也会造成游戏卡一下。Time ms表示一共耗时多少毫秒。Self ms表示表示自身的代码耗时多少毫秒调用其它方法的代码不算在内的。 选择Raw Hierarchy比起Hierarchy会单独列出更多信息Hierarchy实际上是把这些信息合并了。