ARM Mobile Studio是ARM提供的全面分析CPU和GPU性能的工具,功能非常全面且好用。准备写几篇文章分享点经验同时也希望有经验的朋友一起交流。
ARM Mobile Studio一共由4部分组成 1.Streamline 如下图所示,可以收集一段时间CPU和GPU的详细性能信息。

这里包括CPU每个核心的使用情况,以及CPU每个核是如何在线程之间分配工作负载,还可以统计代码函数调用的耗时方法,另外GPU可以统计处理顶点、像素、纹理带宽、加载/储存、OverDraw、缓存、Early-Z等 所有性能的开销,占用多少个GPU周期切一目了然。
2.Performance Advisor Performance Advisor可以将Streamline的数据生成一份概括的报告,这样一眼就能看出性能的瓶颈。

通过这张图一眼就能看出性能瓶颈在GPU的片元上。
3.Graphics Analyzer 分析每个RenderPass和DrawCall的预览工具,像Unity的Frame Debugger又或者RenderDoc,但是数据信息会更加全面。使用鼠标可以在渲染窗口中移动可以输出每个像素OverDraw的层数,当前像素着色的shader名字,这样就可以知道真实渲染的shader是否正确。还可以统计出最耗时的shader列表以及占用的总GPU周期次数。

4.Mali Offline Compiler 离线Shader分析器,这工具非常厉害,可以离线分析出Shader那部分造成的性能问题。

A表示数学计算的耗时,LS表示加载/存储所有非纹理内存访问,V表示顶点到像素的插值耗时,T表示纹理采样的耗时,通过这个工具就可以判断出来那部分是性能的瓶颈。 对于Unity来说要先把glsl里的顶点像素shader另存为一个新文件,然后在执行分析工具就可以了。

高川做了一个工具可以全自动一键分析分析Unity里shader的性能,就是将以上步骤自动化了,大家可以期待这个工具。
每个工具我都会尽可能的详细说说,这篇文章我打算详细说说Performance Advisor一键自动生成游戏性能报告。首先我们需要找一个完美支持的设备,市面上毕竟GPU大多数还是高通,Mali的还是少数。
https://developer.arm.com/tools-and-software/graphics-and-gaming/arm-mobile-studio/support/supported-devices
我用的测试机是OPPO R15 MediaTek MT6771 Helio P60 4 x Cortex-A73 4 x Cortex-A53 Mali-G72 MP3 Bifrost R15
可以看出来,2个CPU一共8核心,GPU是G72一共3个核心,使用的GPU架构是Bifrost

测试机也有了,我们现在需要下载安装ARM Mobile Studio (一共包含上述4个工具)因为是跨平台所以Win和Mac都可以安装测试
注意工具是免费的,下载个人版就可以了。Pro版本需要单独申请,Pro版本可以将报告生成Json文件,方便项目自定义拓展,而且可以支持持续集成CI测试。其他的个人版都可以搞定。
正式接入前看看手机是否是Android 10如果是Android9以及更老的版本,需要把so拷贝到项目的Plugins下在打包测试。

so在performance_advisor的安装目录下,分别有root和没root的两个文件夹,我的手机没有root所以就拷贝unroot文件夹下的so


一定要构建Development版本的游戏包,安装就可以了。
接着在终端里执行下面代码,注意/Users/momo/Desktop 这是我电脑的桌面目录 //捕获数据 // --lwi-fps-threshold 30低于20帧开始截图 // --lwi-frame-gap 100 截图间隔100帧 // --lwi-out-dir 截图存放的目录
python3 /Applications/Arm_Mobile_Studio_2020.2/performance_advisor/lwi/helpers/lwi_me.py --daemon /Applications/Arm_Mobile_Studio_2020.2/streamline/bin/arm64/gatord --lwi on --lwi-fps-threshold 30 --lwi-frame-gap 100 --lwi-mode capture --lwi-out-dir /Users/momo/Desktop/Capture2
选择需要分析的游戏包名

接着我们打开Streamingline,先配置一下Counterer选择你机器的就行了。我的机器是G72所以这里选择G72就行了


点击开始捕获一下,并且启动游戏,捕获时长可以自己控制,比如我这里捕获了20秒,最后点击Stop就可以保存了。

还没完此时要回到命令行那里敲一下回车确保捕获结束。

这时候桌面上应该有两个文件夹,Capture.apc捕获的数据,Capture2捕获的低帧率图片。通过图片的名字我们就可以看到那些是低帧率时截取的游戏图片。

接下来就是根据这两个文件夹来生成报告了,文档上写的就是--frame-capture设置图片路径,但是我设置了会一直卡在 Processing data... 且无法生成。(我觉得这可能是个BUG)
/Applications/Arm_Mobile_Studio_2020.2/performance_advisor/Performance\ Advisor.app/Contents/MacOS/pa /Users/momo/Desktop/Capture.apc --frame-capture=/Users/momo/Desktop/Capture2 --directory=/Users/momo/Desktop/report --application-name="My Game" --device-name="A50" --build-name="First Build"
所以上面的命令要稍微改改,删除--frame-capture 这样报告里就看不了图了。 --directory表示生成最终报告的路径。
/Applications/Arm_Mobile_Studio_2020.2/performance_advisor/Performance\ Advisor.app/Contents/MacOS/pa /Users/momo/Desktop/Capture.apc --directory=/Users/momo/Desktop/report --application-name="My Game" --device-name="A50" --build-name="First Build"
OK 看到这一步我们的报告已经生成了, 接着打开它就可以啦。

打开报告

报告中能看出来性能卡在了片元着色器上,GPU的平均占用率已经超过90%。 先看看CPU的使用情况。

当前帧率是30.2FPS,CPU使用率是55.73M 这是什么意思呢? 文章开头我们提到过R15一共有2个CPU一共8个核心 Cortex-A53 MP4, Cortex-A73 MP4 R15官方给的主频是2GHZ, 这里CPU使用率是 55.73Mhz * 帧率30 = 1671Mhz
在用1671MHZ 除以 2GHZ = 0.81 可以求出CPU当前的使用率大概是8.1% 这和上图报告中平均8.3%基本是吻合的。
再来看看GPU的频率

ARM Mali-G72 MP3 的主频是850MHZ 同样的算法 (27.04MHZ * FPS29.5)/ 850MHZ = 0.93 可以求出CPU当前的使用率大概是93% 这和上图报告中的平均90%是基本吻合的。
所以说我们要想办法降低GPU的cycles数量,显然我们要想办法优化shader的片元着色器了。

注意 Execution Engine cycles 、Load/store cycles 、Varying cycles 、Texture cycles 并不是线性累加,它们是并行的,这是由GPU架构决定的。

所以我们可以得出目前shader的卡顿就是Execution Engine cycles和Texture cycles造成的,也就是shader中的数学计算还有贴图采样引起的。
再来看看带宽ARM推荐只要手机带宽控制在每秒5G以内就可以了,算下来每帧就是(5*1024)/60 = 85M带宽。下图中我们可以看出每帧带宽只用了36.23M 所以带宽完全没有压力。

还有顶点、几何、像素、overdraw的信息都可以在报告中看到,通过这个报告,我们就能对整个游戏的性能有个初步的预览,下一回我们详细看看streamingline的信息。