Unity性能优化_第七章
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实际上是把这些信息合并了。