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

简介:

一、子函数的堆栈信息

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
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
3月前
|
存储 编译器 Go
面试官:请说一下如何优化结构体的性能?
面试官:请说一下如何优化结构体的性能?
|
4月前
|
缓存 Java 编译器
探究Java方法的优化与最佳实践:提升性能与代码可维护性
探究Java方法的优化与最佳实践:提升性能与代码可维护性
|
6月前
|
机器学习/深度学习 缓存 Linux
很底层的性能优化:让CPU更快地执行你的代码
很底层的性能优化:让CPU更快地执行你的代码
|
10月前
|
程序员
【编程】程序的局部性原理对代码效率的影响
【编程】程序的局部性原理对代码效率的影响
75 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
存储 安全 算法
STL中有哪些副作用或稍不注意会产生性能开销的地方?
可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。但是其实不然。我感觉可能是很多人都知道对于vector而言,clear()之后,修改了size()的结果,不影响capacity()的结果,因而得出clear()只是修改了某个标记,是常量时间复杂度的错误结论。
667 0
|
开发框架 安全 .NET
学习CLR源码:连续内存块数据操作的性能优化
本文主要介绍 C# 命名空间 System.Buffers.Binary 中的一些二进制处理类和 Span 的简单使用方法,这些二进制处理类型是上层应用处理二进制数据的基础,掌握这些类型后,我们可以很容易地处理类型和二进制数据之间的转换以及提高程序性能。
146 0
|
编译器 C语言 C++
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
127 0
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
|
算法 程序员
深究递归和迭代的区别、联系、优缺点及实例对比
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.
185 0
|
算法 测试技术 索引
性能优化技巧 - 位置利用
SPL的特征之一是数据有序,适当地利用位置,可以显著提高性能。让我们先从一个典型场景开始,逐步掌握利用位置的各种技巧。 快速查询对排序后的数据进行二分查找,可以获得较高的性能,但有些算法需用到原始顺序,看上去似乎不该再排序。
1012 0