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

简介:

一、子函数的堆栈信息

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

目录
相关文章
|
1月前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
27 0
|
4月前
|
存储 编译器 Go
面试官:请说一下如何优化结构体的性能?
面试官:请说一下如何优化结构体的性能?
|
7月前
|
机器学习/深度学习 缓存 Linux
很底层的性能优化:让CPU更快地执行你的代码
很底层的性能优化:让CPU更快地执行你的代码
|
11月前
|
程序员
【编程】程序的局部性原理对代码效率的影响
【编程】程序的局部性原理对代码效率的影响
82 0
|
缓存 网络协议 算法
网络开销是什么意思?底层原理是什么?
网络开销是什么意思?底层原理是什么?
1619 0
|
数据采集 Linux Python
再谈文件读写:判断文件的几种方法及其优劣对比
学习是循序渐进的过程,若能建立知识点间的联系,进行系统性的学习,那将更有助于效果。阅读这篇文章,你将读到如下内容: 1、判断文件的方法(try语句、os模块、pathlib模块)2、以上几种方法的优劣对比
133 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
开发框架 安全 .NET
学习CLR源码:连续内存块数据操作的性能优化
本文主要介绍 C# 命名空间 System.Buffers.Binary 中的一些二进制处理类和 Span 的简单使用方法,这些二进制处理类型是上层应用处理二进制数据的基础,掌握这些类型后,我们可以很容易地处理类型和二进制数据之间的转换以及提高程序性能。
153 0
|
编译器 C语言 C++
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
135 0
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )

热门文章

最新文章

相关实验场景

更多