优化方法进阶—定位子函数的开销

简介:

一、子函数的堆栈信息

1、查看子函数的CPU走势

在以前的UWA性能测评报告中,我们可以查看渲染模块Camera.Render的总体CPU耗时,如下图:
请输入图片描述
这种逐帧查看的办法可能存在一些关键信息漏失的隐患。为此,我们在原有功能基础上增加了子函数走势查看功能:点开主函数的堆栈信息,我们就可以查看其任意一个子函数的CPU完整走势,从而更为精准地定位性能瓶颈。

下图是个例子,即通过依次选择Culling和CameraEffect.OnPreCull,能直接定位到部分场景中Culling计算瓶颈(黄色区域)。
请输入图片描述

具体操作方法可见如下视频:

2、堆内存泄露问题的定位效率进一步提升

当一个项目的堆内存发生泄漏时,我们会在UWA的Mono测评报告中看到类似下面的图:
请输入图片描述

在我们通过堆内存的具体分配堆栈来进行泄露点的定位时,一般情况下,我们会认为下图中红框函数为堆内存泄露的主要对象(其驻留内存最大为1.22 MB),并对其进行详细的检测。
请输入图片描述
但事实上,当我们分别选择这两个函数,会发现红框函数在整个项目运行阶段的堆内存分配非常平稳,并不存在上升趋势,真正造成泄露的是上图中的蓝框函数。

请输入图片描述
红框函数的堆内存走势非常平稳

请输入图片描述
蓝框函数的堆内存上升明显

在UWA以前的报告中,我们需要花费大量的时间来对其进行检测、分析和验证,而现在,只需要点击两下Checkbox即可进行判定。通过该方法,能有效减少研发团队定位泄漏的时间,并更精准地定位泄漏点。

*上述新功能为专业会员权限。


二、项目性能排名功能

该功能将测试项目与UWA数据库中的的参数指标进行比较,让研发团队更明确自身项目在同类型/全类型项目中的排名情况,并且客观认识到某些模块上的优势和不足,从而帮助研发团队更加高效地判断优化的优先级。

该功能主要有以下部分:

1、总体性能排名
总体性能在宏观上主要反应在CPU、内存和耗电量三个指标中,而CPU中又分为渲染、UI、动画、粒子系统和加载等重要引擎模块,内存则分为纹理、网格、动画片段、音频片段和材质等重要资源。

我们不仅将测试项目与同设备的测试数据进行排名,同时,还将与相同类型的的性能数据进行比较。如下图,项目A是一款ARPG项目在设备红米Note2上的总体性能排名,其在CPU耗时方面相当不错,优于70%的同设备(红米Note2)上测试的所有项目;并且优于67%同设备(红米Note2)上测试过的所有ARPG项目。
请输入图片描述

同时,在引擎模块中,其渲染、物理和加载模块都非常优秀,UI模块次之,而粒子系统模块则相对耗时较高,仅高于10%的同设备同类型测试,这意味着接下来的研发过程中,研发团队需要加强对粒子系统的优化。特别是对于研发工期较为紧张的团队,我们建议优先考虑粒子系统优化,而不是渲染和加载模块,因为同样的时间投入,粒子系统带来的优化效果更加立竿见影,性价比更高。
请输入图片描述

2、各模块重要参数排名
在UWA测评报告中,我们对Unity引擎的各个主要模块以及各种主流资源的具体参数中都进行了排名,从而更为细致地让用户看到项目需要完善的地方。

比如,下图中该项目的内存占用为245MB,虽然要高于UWA的推荐值,但在整个行业的同类型游戏中,该项目仅高于28%的项目。
请输入图片描述

但是,仍需要注意的是,该项目虽然整体内存使用低于行业平均值,但其GFX内存占用则超过了83%的同类型行业数据,这说明该项目的GFX内存仍有较大空间可以下降,研发团队可以直接通过检测纹理、网格等资源数据来即刻对其进行优化和完善。
请输入图片描述

以上即为排名功能的主要使用场景,用户可以根据自身实际情况来查看对其更有针对性的性能瓶颈参数,并对其进行快速完善。我们希望通过该功能可以让研发团队看到自己的优势和不足,高效提升自己项目的游戏品质。另外,我们也不会不断更新和细分行业数据,以求做到更精准、更全面、更有建设性。






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
5月前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
149 1
|
3月前
|
设计模式 存储
代码优化设计问题之优化枚举的getByName方法以提高效率问题如何解决
代码优化设计问题之优化枚举的getByName方法以提高效率问题如何解决
|
4月前
|
存储 算法
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
64 0
|
5月前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
141 0
|
5月前
|
分布式计算 并行计算 算法
图计算中的性能优化有哪些方法?请举例说明。
图计算中的性能优化有哪些方法?请举例说明。
43 0
|
程序员
【编程】程序的局部性原理对代码效率的影响
【编程】程序的局部性原理对代码效率的影响
122 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
数据采集 Linux Python
再谈文件读写:判断文件的几种方法及其优劣对比
学习是循序渐进的过程,若能建立知识点间的联系,进行系统性的学习,那将更有助于效果。阅读这篇文章,你将读到如下内容: 1、判断文件的方法(try语句、os模块、pathlib模块)2、以上几种方法的优劣对比
174 0
|
编译器 C语言 C++
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
155 0
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )