【游戏测试】客户端性能 - drawcall 工具链

2024-03-25 23:08

本文主要是介绍【游戏测试】客户端性能 - drawcall 工具链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文由资深游戏测试开发工程师 陈子昂,发表于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大会(第十届中国互联网测试开发大会)

这篇关于【游戏测试】客户端性能 - drawcall 工具链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846545

相关文章

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查