目录
一、相关术语
1.物理页
2.PSS内存
3.Reserved Total
二、耗时推荐值
三、内存推荐值
四、分析工具
1.Profiler
(1)Profiler各平台对比
(2)构建到目标平台
(3)Frame数量修改
(4)CPU Usage
(5)Rendering
(6)Memory
2.Unity Frame Debugger
(1)打开方式
(2)面板介绍
3.XCode Frame Debugger
(1)Metal API
(2)Windows端其他图形API
一、相关术语
1.物理页
物理页(Physical Page)是计算机内存管理中的一个基本概念。它指的是计算机物理内存(RAM)中的一个固定大小的块。物理页是操作系统用于管理和分配内存的基本单位。
2.PSS内存
PSS内存(Proportional Set Size)是衡量进程内存使用的一种方法。它通过按比例分配共享内存页来反映每个进程实际占用的物理内存。具体来说,PSS内存包括以下部分:
- 私有内存:完全由该进程独占的物理内存。
- 共享内存的比例分配:当多个进程共享同一物理页时,这个页的大小会按比例分配给每个进程。例如,如果一个物理页被两个进程共享,每个进程的PSS会增加该页的一半大小;如果被三个进程共享,每个进程的PSS会增加该页的三分之一大小。
3.Reserved Total
在内存管理中,Reserved Total 通常是指进程或应用程序保留的总内存量。这包括所有已分配但可能尚未实际使用的内存。具体来说,Reserved Total 包括以下几部分:
- 资源内存:这是指游戏或应用程序加载的各种资源所占用的内存,比如纹理、音频、模型和其他多媒体资源。
- Mono堆内存:对于使用Mono(一个开源的跨平台.NET框架)的项目,Mono堆内存是指由Mono运行时管理的堆内存。Mono堆内存用于分配和管理托管对象(如C#对象)。
- Lua内存:对于使用Lua脚本语言的项目,Lua内存是指由Lua虚拟机管理的内存,包括Lua脚本执行过程中分配的各种对象和数据结构。
二、耗时推荐值
为了达成对应的帧率,需要将CPU耗时控制住一定的数值范围内,对于30帧,总耗时需要控制在33ms以下,对应的模块也需要有对应的耗时范围:
三、内存推荐值
在游戏开发中,控制PSS内存峰值是避免游戏闪退的重要策略之一,因为它直接影响到系统是否能够为游戏提供足够的物理内存。当PSS峰值过高时,系统可能会因为无法满足游戏的内存需求而导致闪退。因此,通过优化资源加载、管理内存碎片、监控和调试工具等方法,可以有效控制PSS峰值,从而提高游戏的稳定性。
PSS内存的大头在于Reserved Total中的资源内存和Mono堆内存。对于使用Lua的项目来说,还应关注Lua内存。
根据UWA的经验,只有当PSS内存峰值控制在硬件总内存的0.5-0.6倍以下的时候,闪退风险才较低。举例而言,对于2G的设备而言,PSS内存应控制在1G以下为最佳,3G的设备则应控制在1.5G以下。
而对于大多数项目而言,PSS内存大约高于Reserved Total 200MB-300MB左右,故2G设备的Reserved Total应控制在700MB以下、3G设备则控制在1G以下。
四、分析工具
1.Profiler
- Unity Profiler是一种可以用来获取应用程序性能信息的工具。
- 可以测试应用程序在目标发布平台上的运行情况,也可以在Unity编辑器中概要了解运行情况。
- 可以收集并显示有关应用程序各个方面(例如CPU、内存、渲染器、音频等)的性能数据。
- 可以根据性能数据来判断性能瓶颈,并且针对性进行选代优化。
(1)Profiler各平台对比
特点 | 适用场景 | |
Play Mode | 数据不准确,但是方便快捷 | 快速修改一些设置以确定性能问题时可以使用 |
Edit Mode | 只检测编辑器自身的数据 | Unity编辑器运行迟钝时,其他情况下一般不会考虑使用 |
目标平台 | 数据准确,但是构建应用会花费时间 | 一般都推荐在目标平台测试 |
(2)构建到目标平台
Unity端设置:
- 勾选Development Build
- 勾选Autoconnect Profiler (可选)
Android端设置
- 使用ADB:开启开发者模式,使用线缆将设备连接至计算机
- 远程连接:连接WiFi网络,手机与计算机位于同一子网即可
(3)Frame数量修改
显示的Frame数量默认为300帧,可以在首选项中增大这个数值,但是会有性能开销。
(4)CPU Usage
所有的时间消耗被分为9个类型,用不同的颜色进行区分:Rendering渲染、Scripts脚本、Physics物理、Animation动画、GarbageCollector垃圾回收、Global Illumination光照、VSync垂直同步、UI用户界面、Others其它。
当选中CPU Usage时,面板下方会出现Hierarchy:
- Total: Unity在特定函数上花费的总时间百分比
- Self: Unity在除去调用子函数的特定函数上花费的总时间百分比
- Calls: 此帧中调用此函数的次数
- GCAlloc: 垃圾收集
- Time ms: 总时间
- Self ms: 除去子函数的总时间
(5)Rendering
在帧图表区域显示了4类信息:Batches Count批次数、SetPass Calls Count切换通道的次数、Triangles Count三角形数、Vertices Count顶点数。
当选中Rendering时,通过面板下方可打开Unity Frame Debugger窗口:
(6)Memory
在帧图表区域显示了7类信息:Total Used Memory使用的内存量、Texture Memory纹理内存量、Mesh Memory网格内存量、Material Count材质实例数、Object Count原生对象实例数、GC Used Memory GC的内存量、GC Allocated in Frame GC堆中每帧分配的内存量。
2.Unity Frame Debugger
市场上有很多帧调试工具,如Visual StudioGraphics Debugger、Intel GPA、 RenderDoc、NVIDIA NSight、AMD GPU PerfStudio等等。这些工具各有特点,功能都很强大,能够收集大量信息来进行深入分析。但是它们都非常复杂,而且需要构建独立的应用来启动外部工具。
Unity Frame Debugger使用方便又简单,能够快速获得很多重要的信息,还可以帮助我们检查合批情况。使用Frame Debugger为我们提供了很多有价值的信息:
- 查看当前帧画面的渲染流程,它可以列出所有的绘制调用,并能够按照顺序逐步执行每个调用。
- 查看Draw Call的调用次数,并通过顶点/索引数量来间接衡量场景的渲染代价。还能够检查Batch是否正常合批,以及检查不合批的原因。
- 还可以访问着色器属性以获得关于材质和着色器的更多信息,也可以得到被对象使用的数据的引用。
(1)打开方式
- 窗口位置:Window窗口> Analysis分析>Frame Debugger帧调试器
- 其它开启方式:从Profiler Rendering模块点击Open Frame Debugger
(2)面板介绍
点击Enable按钮即可捕捉当前帧的画面,会将应用冻结到该帧,如果在Unity编辑器中会自动暂停。
Editor表示此时在编辑器中分析,也可以像Profiler一样连接设备远程调试(需要支持多线程渲染)
- 工具栏中的左右箭头按钮用于在列表中向前和向后移动一步
- 窗口顶部的滑动条可以在绘制调用中快速拖动来迅速定位要关注的事项
- 右侧面板提供了有关绘制调用的更多信息,例如用于渲染的Shader、Pass、Keywords等等
- 它还能够显示当前合批的情况,以及为什么无法进行合批
3.XCode Frame Debugger
- Xcode提供了一套出色的GPU性能分析和调试工具
- Xcode Frame Debugger可以记录 Metal API 调用并生成GPU帧捕获
- 可以使用帧捕获中的信息来调试应用的命令、着色器代码和GPU性能
- 只支持Metal API的应用
(1)Metal API
Metal API是由苹果公司开发的一个低级图形和计算API,专门用于iOS、macOS和tvOS设备。它旨在提供高效的硬件加速图形和计算功能,允许开发者直接访问设备的GPU(图形处理单元),从而实现更高性能的图形渲染和数据处理。以下是Metal API的一些主要特点:
- 高性能:Metal API通过减少CPU与GPU之间的开销,提供了更高效的资源管理和任务调度,从而提升了应用程序的整体性能。
- 低级控制:与OpenGL等其他图形API相比,Metal提供了更低级别的控制,使开发者能够更精细地管理内存、命令缓冲区和同步操作。
- 并行计算:除了图形渲染,Metal还支持并行计算任务,这使得它不仅适用于游戏和图形密集型应用,也适用于需要高性能计算能力的数据处理应用。
- 多平台支持:Metal API可以在iOS、macOS和tvOS设备上使用,这使得开发者可以更容易地跨苹果生态系统进行开发。
- 现代化设计:Metal API采用了现代化的设计理念,支持最新的图形技术,如着色器编程、纹理处理、多线程渲染等。
- 工具和调试支持:苹果提供了一系列工具,如Xcode中的Metal调试器和分析器,帮助开发者优化和调试他们的Metal应用程序。
总之,Metal API为开发者提供了一个强大且灵活的平台,用于创建高性能、复杂的图形和计算应用。
在Unity 2020.1 中IOS平台已删除 OpenGLES2/3,后续的版本中也没有Auto Graphics API这一项。当使用Unity发布iOS应用时,生成的Xcode项目默认情况下会使用Metal API进行图形渲染。Metal是苹果推荐的图形API,因为它提供了更高效的性能和更低的开销。
(2)Windows端其他图形API
在Unity中发布Windows应用时,可以使用多个图形API。默认情况下,Unity会选择最适合的平台和硬件的图形API,但也可以手动配置它们。
Direct3D 11 (D3D11):
- 这是Windows平台上最常用的图形API,具有良好的性能和广泛的硬件支持。
- 默认情况下,Unity通常会选择Direct3D 11作为首选API。
- 左手坐标系。
Direct3D 12 (D3D12):
- 提供更低级别的硬件访问和更高效的多线程渲染,但需要较新的硬件和操作系统支持。
- 可以手动启用以利用最新的图形功能。
OpenGL:
- 跨平台的图形API,但在Windows上不如Direct3D流行。
- 通常作为备用选项,适用于特定需求或兼容性问题。
- 右手坐标系。
Vulkan:
- 新一代跨平台图形API,提供高性能和低开销。
- 需要手动启用,并且可能需要额外的配置和测试。