UPA深度性能报告解读

做者:张涛,腾讯互娱测试工程师
商业转载请联系腾讯WeTest得到受权,非商业转载请注明出处。
原文连接:http://wetest.qq.com/lab/view/403.htmlhtml

WeTest 导读

UPA做为腾讯WeTest与Unity官方联合打造的客户端性能分析工具,为开发者提供了极大的便利和效能提高。产出的分析报告内容详尽,但您是否真的读懂了报告?是否了解每项数据的含义?这次就让咱们的大咖来为您详细解读UPA的性能报告,让您瞬间秒懂。android


测试概况

通常作完数据收集后,查看upa深度性能报告,最早看到的就是测试概况页面。ios

图片描述

上面的数据大体能够分红这几个方面来看:浏览器

1)平均帧率既和CPU耗时有关(点击下方的经过/未经过按钮可跳转到CPU模块),也和GPU耗时有关。函数

2)ReservedMono内存能够理解为游戏中脚本分配的内存,进一步定位能够借助upa的mono内存测试(详见附录)。工具

3)纹理、网格、动画、音频等能够理解为资源内存,进一步定位能够借助upa的资源内存测试(详见附录)。性能

4)drawcall和Tris和GPU耗时有关,进一步定位能够借助针对GPU分析的工具(详见附录)。测试

5)pss内存通常用于定位多局战斗、场景跳转、打开关闭UI中是否有内存泄漏,能够借助wetest助手中的通用性能测试获取。优化

经过概况页面能够大体看出游戏存在的性能问题,upa也给出了问题和优化建议:动画

图片描述

CPU

cpu模块提供了CPU耗时相关的详细数据。

cpu性能占用这一页签的概述给出了各模块的总体耗时:

图片描述

frameTime:当前帧总耗时;

RenderingTime:当前帧渲染耗时;drawcall越高,这部分开销越大。能够经过减小所渲染物体的材质种类(内存页签下的材质资源),下降drawcall。

ScriptTime:当前帧函数耗时。

PhysicsTime:当前帧物理耗时。

从上图中能够看出函数和渲染耗时比较多,能够看下概况页面下的耗时排名top10的模块:
图片描述

针对耗时较高的帧,能够查看详细的模块耗时状况:

图片描述

图片描述

好比上图选取的第1401帧耗时较大(场景加载),能够展开模块耗时,查看具体模块具体函数的耗时、时间占比以及每一帧的GC Alloc。

Loading.UpdatePreloading,主要负责卸载当前场景的资源,而且加载下一场景中的相关资源等。下一场景中,自身所拥有的GameObject和资源越多,其加载开销越大。

内存

内存模块反映了游戏各方面的内存占用状况。

图片描述

上图中的total_reserved是unity引擎在内存方面的整体分配量,total_used是unity引擎在内存方面的整体使用量,unused_total是空闲的内存。这里的引擎分配内存和空闲内存都比较多。

total_reserved内存=unity_reserved内存+GFX内存+FMOD内存+Mono内存+Profiler内存

下面分别展开说明:

图片描述

unity reserved:这部分主要包括资源内存。能够针对纹理、网格、动画、材质、音频资源优化。好比FBX模型导入时,"Read/Write Enable"是默认开启的,mesh数据会保留一份在unity reserved中,关闭能够减小该模型在unity reserved中占用内存一半的大小。

图片描述

mono reserved:分配的mono内存(绿线部分),只升不降,须要严格控制。mono内存表示游戏中脚本分配的内存,虽然mono自己提供了垃圾回收机制,但仍是可能出现内存泄漏。若是须要进一步定位,须要借助upa的mono内存测试(详见附录)。
图片描述

gfxdriver_reserved表示渲染模块的内存,若是比较高须要对纹理资源和Shader进行优化。

图片描述

fmod_reserved表示音频模块的内存,若是比较高须要对音频资源进行优化。

图片描述

profiler_reserved表示unity profiler分配的内存,无需关注。

图形

图形模块和GPU耗时相关。

图像概况页签的几个指标:
图片描述

1)SetPassCalls

渲染Pass的数目,每一个Pass都会消耗对应的一个drawcall,在知足渲染效果的状况下尽量的减小Pass的数量。

Shader “ShaderLab Tutorials/TestShader"{

SubShader{

Pass

{

//...

}

}}

2)drawcalls:

cpu发送给gpu的渲染请求数,请求中包括渲染对象全部的顶点、三角面、索引值、图元个数等。

图片描述

3)verts:

摄像机视野内渲染的顶点总数。

4)tris:

摄像机视野内渲染的三角面总数。

图片描述

5)VRAM usage:

显存的使用状况,它的总大小取决于显卡的显存。

图片描述

6)VBO Total:

渲染过程当中上传到图形卡的网格的数量。

图片描述

这是合批页签中的概述,表示在标识区域中开启动态合批后平均节省下3.24个drawcall。
图片描述

这是模块耗时页签中的概述,Camera.Render表示相机渲染准备工做的cpu耗时;Shader.Parse表示资源加入后untiy引擎对shader的解析耗时。Shader.CreateGPUProgram表示GPU对加载进来的新shader针对目标平台编译的耗时。
图片描述

图片描述

图片描述

附录

一、mono内存测试

条件:手机已root,且系统非android 7.0及以上。

测试方式:在合适的时间点打2次以上的内存快照,进行对比(获取保留和新增的资源类型、对象堆栈、引用次数)。好比主城反复跳转的场景发现mono内存一直在增加,就能够在场景跳转前打一个snapshot1,在场景跳转后打一个snapshot2,最后在场景跳转回原主城再打一个snapshot3。
图片描述

图片描述

二、资源内存测试

条件:手机已root,且系统非android 7.0以机上。

资源结论:
图片描述

资源重复是指内存中同一时刻,存在两份或以上相同的纹理、网格、动画、音频等资源。通常是相同的一份资源被打包到多个AB包中,若是这些AB都被加载进内存,内存中就会存在多份相同的资源。这个比率是按重复资源的大小除以总资源的大小来算的。

若是资源重复率超标,通常是优先处理资源较大、重复数量较多的纹理或网格。

图片描述

纹理资源超标,通常优化的方向:

1)纹理用于UI,禁用mipmaps;

2)尽量下降纹理分辨率,不要超过2048*2048;

3)android尽可能使用ETC格式,ios使用PVRTC格式;

4)低配机目前通常不支持openGL3.0,故使用ETC2时会自动转换成RGBA32,纹理占用大概是中高配机的4倍。解决方法是统一改为全部机型都支持的ETC1,一张RGB,一张alpha,渲染时再合并。
图片描述

网格资源超标,通常优化的方向:

1)减小顶点和三角面数。Simple LOD插件能够用来简化网格资源;
图片描述

2)若是网格资源数据不进行读写操做,须要将Read/Write Enable关闭。
图片描述

动画资源超标,通常优化的方向:

1)在不影响表现的前提下,减小Animation的帧数;

2)开启"Optimize GameObject";

3)按需加载,好比在战斗中会有角色站立、死亡、攻击等动画剪辑,这些不用在战斗的每一帧所有加载。
图片描述

音频资源通常不多超标。

三、Adreno Profiler

比较经常使用的针对GPU分析的工具备Mali、PowerVR、Adreno Profiler等,比较方便使用的仍是高通的显卡分析工具Adreno Profiler。(P.S. 目前adreno profiler不更新了,若是抓取不了游戏单帧,推荐使用intel GPA+模拟器的组合)

使用条件:查看手机是否高通芯片,PC上装有adb环境。

首先手机上打开游戏,运行到须要抓取的界面,而后在PC端打开Adreno Profiler,点左上角的Connect。

双击链接以后,点击Scrubber GL弹出抓取界面,而后点击Caputure Frame等待便可。

图片描述
图片描述

Frame states下查看渲染相关参数:

好比Miscellaneous选项下Total Texture Usages为纹理显存使用总量:

图片描述

好比Texture Formats选项下为纹理格式分布:

图片描述

图片描述

好比Render Calls可视为draw call统计:

图片描述

左边是抓取到的当前帧的全部绘制指令,鼠标在listview中从上到下点击,能够还原当前帧的绘制过程。
图片描述

这个是纹理浏览器,是捕获帧加载进来的纹理资源。从上面的截图能够看出来这个图集(将许多单个的纹理合并到一个较大的纹理上)填充的不饱和,能够拆分红1024*512的图集。

也能够发现有如出一辙的纹理且重复多个:
图片描述

图片描述

这个是shader浏览器,能够针对一些消耗性能比较大的shader作优化。

vertex shader:顶点着色器,逐顶点计算,计算次数等于顶点数。

fragment shader:像素着色器,逐像素计算,计算次数等于像素数。

通常对于shader优化的建议:

1)在不影响效果输出的状况下减小变量的精度;避免数据类型的转换。

2)减小或避免使用幂函数、指数函数、三角函数等复杂的函数运算,使用近似方程替代。

怎样查看shader优化后,性能是否提高了呢?

这里要使用Grapher->App Metris Graph里的一些监测指标进行优化先后的对比:

EGL(FPS)

GPU General(%Busy)

GPU Shader Processing(%Shaders Busy,%Time Shading Fragment/Vertices)

图片描述

另外还有一些能够进行覆盖测试,好比fps均值比较低,那究竟是CPU仍是GPU形成的瓶颈呢?将DisableDrawElements替换为false,看FPS和GPU General(%Busy),若是有较大变化则是GPU形成的瓶颈。
图片描述

最后对GPU瓶颈识别作个总结:

图片描述


欢迎使用WeTest UPA,无需ROOT或接入SDK,认证用户即享60分钟使用时长,点击:http://wetest.qq.com/product/cube 便可下载。

若是使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015

相关文章
相关标签/搜索