关于游戏:游戏测试客户端性能-drawcall-工具链

5次阅读

共计 2392 个字符,预计需要花费 6 分钟才能阅读完成。

原文由资深游戏测试开发工程师 陈子昂,发表于 TesterHome 社区,点击原文链接可与作者交换。

个别 drawCall 能够了解成是调用次数,到底是调用了什么,个别性能测试外面会关注哪些。
提交给程序,Good 程序会说:这个中央可能是真有问题,我有空时看看。
Bad 后果 程序:这真没法修,肯定让我对着这个修,我就原地下线了。
那么应该怎么做,本文会去掉公式和一些学术词汇。

简述下基本概念

挪动端目前支流还是 OpenGL,drawCall 是 OpenGL 的绘制次数,也是优化参考指标,能够占到 4 分之一。
每次 Cpu 演算好,预设好顶点数据,在绘图前,会把顶点数据,地位,法线,色彩,纹理坐标,切线告诉 Gpu 进行渲染绘制
drawcall 数量越多就别离进行对不同的顶点数据进行下面一样的渲染绘制的次数越多,次数等于 drawcall 数量。
drawcall 数越多,Cpu 不会解决不过去(有些文章会说堵在 Cpu,于是 Cpu 笑了),这样 Gpu 渲染承当的就更多。
drawcall 会对物件进行分类,不同分类类似度高的,drawcall 会缓存一部分,因为能够批量解决。

切入点

咱们说下 drawcall 过高,能够找到一处切入点的

1. 设置场景内粒子,然而只有发射,没有销毁。

游戏测试会怎么做,首先编写好用例,tag= 客户端性能测试
关键性:执行重复操作一个特定事务,操作行为个别为 准备就绪 -A-B-A-B,不会掺杂到其余的操作。
事务特定性留神是不能用关上敞开背包这种,须要对场景进行实际操作的,如果 2D 游戏,去通过关上敞开把背景界面升高到下一层做遮挡也是能够的。

3D 游戏事务实例:

准备就绪 - 挪动到水波淋漓的湖边(A 可见水波淋漓的湖边),B- 丢出了一个特效技能比方 6 级不规则体冰球,A- 可见水波淋漓的湖边,B- 丢出了一个特效技能 6 级不规则体冰球。

操作形式:
绑定自动化测试框架优于人工测试,起因是机器每次的执行步骤是严格统一的,而人不肯定会严格依照操作步骤。
启动一个新的过程对自动化测试框架做监听服务,由这个进行收集 drawcall,最好的形式是由该过程是一个接收数据的过程,程序 rpc 用字节流模式进入接收数据的管道。

准备就绪环境 – 最好是有一个 mock 服务,因为 gm 指令能够挪动到指定地位,然而造号失常状况下须要先过疏导,达成技能冰球条件,比方满足某个等级冰球。
在跑自动化的时候,能够通过 mock 服务 (聚合多个接口,反对组合条件生成的创号规定) 返回造号胜利后,主动连接自动化进行采集。
程序或者调用引擎收集形式都应该能够取得以下数据。

{"type":"湖面","triangles":200,"Instance":2,"total_triangle":400}  
{"type":"冰球","triangles":1200,"Instance":2,"total_triangle":2400}  

1 个湖面会有好多个湖面,1 个冰球也会不止 1 个 type= 冰球的,所以下面数据是一个对象,应该是一个对象数组的模式, 数组的个数也就是 drawCall 次数。

数据敏感度:
1. 屡次操作能够关注 Instance 实例数。
2. 类型是否正当,如果视线内湖面很大,然而冰球数很多,也是须要记录的
以上自动化脚本是能够预设的,数据敏感度的断言也是一样的。

自动化采集的话,会在同一个地位做二次复查,才会定位 Bug,这个作用是查看复现步骤。

Bug 产出:数据敏感度局部 +drawcall 持续增长 就是该工具 Bug 产出。

那个场景有一些动图(2D 看场景背景图比方一些特效,3D 要看以后摄像机镜头,测试时请先固定摄像机镜头),并且渲染范畴比拟大,则对性能影响更大。

所需基建能力
1. 录屏计划:安卓录制屏幕的,因为 adb 会占用 adb forward, 并且只能 3 分钟一个视频,如果其余录制计划的,记得端口号和 adb 用同一个。
2. 多媒体解决能力:ffmpeg 去开发依据视频长度去抽帧,作用很大,最大作用不是按一帧一张预先拆不必梗塞 IO。
3.logcat 日志,不同版本的内容数量有差异。

产出打法
1. 开始记录监听的中央,开始录制屏幕 (须要进步分辨率的),实现后,最初在应用多媒体解决能力基建,drawcall 高的中央提供一组照片。
logcat 日志加上面的,能够做操作复现。
程序会取得对应 Bug 单子: 外面附加可见测试用例,drawcall 高的中央有一组图片和 logcat 日志。

2. 依据下面的 html

{"type":"湖面","triangles":200,"Instance":2,"total_triangle":400}[]数组

和另外一个数组,统计出一个残缺的数据
测试用例总会有个名字的

sessionId = 用例名操作 1 次(事务的一半)
sessionId:{
        "type":"湖面",“image":" 素材的地位 ","drawCall_nums":50,"Instance_nums":10,}

drawCall_nums= 下面同一个类型数组总数,Instance_nums 是实例总和
drawCall_nums 和 type 不合理的数据是通过公式计算出来的。

多个 sessionId 就能依据一次的后果去剖析到 drawCall_nums 和 Instance_nums 的回升和降落。所以这里看到须要预约一个规范,也能够找程序要一个标杆场景,如果比这个还要高的必定是要修复的。

3. 历史数据,每个阶段跑一下,看趋势。

4. 补充信息

依据到这个排查出的后果,去游戏内复现后找到具体函数执行的,看 Profiles,等于是通过多组自动化行为去达到扫描和分工合作(一个人应用,一个人去编辑器版本那边拿补充信息)。

序幕

事务该如何找和有啥其余技巧,请期待下个文章: 客户端性能热力求

以上是明天的分享,你学废了吗~
想学习更多干货常识和前沿技术?
想结识测试行业大咖和业界精英?
欢送关注 2022 MTSC 大会(第十届中国互联网测试开发大会)↓↓↓

正文完
 0