此为网易游戏在中山大学计算机科学与技术专业2019~2020学年第一学期开设的选修课程《移动互联网编程实践》作业。
Airtest脚本开源地址:https://github.com/wu-kan/FGO-AirTester.air
Airtest运行报告地址:https://wu-kan.github.io/FGO-AirTester.air/log.html
PerfDog性能数据地址:https://perfdog.qq.com/case_detail/336356,Password: KBKmyX
完整测试视频地址:https://www.bilibili.com/video/av80128598/
作业主题
游戏的性能测试
作业内容
选择一款你喜欢的游戏,设计一段性能测试用例并执行测试,给出分析报告。
作业要求
- 测试用例:用思维导图描述测试方案
- 性能指标:列举指标及其具体含义
- 工具:若使用现有工具,介绍其使用方法
- 开发:根据需要可以适当开发,描述开发目的、思路及效果
- 结果分析:描述发现的性能问题(如果有)并分析原因,或者解释测试中的现象
- 平台:不限(安卓,IOS,Windows等)
- 展示:挑选优秀作业展示
- 诚信:独立完成
实验环境
测试游戏
Fate Grand Order,国服版本号为v1.55.244193。下述介绍截取自游戏官网。
Fate系列首款正版手游,100万字剧情描绘史上最大圣杯战争!《FGO》剧情原案由Fate之父奈须蘑菇亲自执笔,长达100万字的小说级故事线将为您揭露多重背景设定!
史上最多英灵集结,跨越时代的终极召唤!在《FGO》中可召唤的从者包含了《Fate/Zero》、《Fate/stay night》等多部知名Fate作品中的经典角色,以及多位《FGO》首创英灵与您展开命运的羁绊,更有全新职阶首次于Fate系列中登场!
指令卡式战斗,原汁原味的日式RPG!在《FGO》中,战斗通过对从者下达的命令用指令卡来表现,通过回合制的形式展开指令战斗。战斗分为战术阶段与指令阶段,根据您的选择,从者会分别发动攻击。己方攻击后,转为敌方行动。敌方行动后一回合结束。
50多位知名画师参与英灵绘制,40位以上声优倾情献声!《FGO》力邀武内崇在内的50余位知名画师组成超豪华美术团队,更特邀Fate系列原班声优参与配音!
测试工具
自动化工具
Airtest是由网易开源的一款基于OpenCV的跨平台的UI自动化框架,适用于游戏和App。下述介绍来自于其GitHub上的开源仓库。
- 各种运行:Airtest提供了跨平台的API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位UI元素,你无需嵌入任何代码即可进行自动化。
- 扩展性:Airtest提供了命令行和python接口,可以很容易地在大规模设备集群上运行。自动生成的HTML报告,包含详细步骤和录屏,让你迅速定位失败点。
- AirtestIDE: 是一个强大的GUI工具,可以帮助你录制和调试自动化脚本。 AirtestIDE支持了完整的自动化流程:录制脚本->真机回放->生成报告。
- Poco: Poco 框架可以直接访问UI控件,支持主流平台和游戏引擎。通过Python API操作UI控件,可以实现更强大的自动化控制。
这里是官方教程。
性能测试工具
腾讯WeTest明星工具PerfDog在2019年11月正式对外发布(非常新的工具喔)。PerfDog作为一款性能测试和分析工具,支持全平台的应用形态测试,包括Android、iOS、小游戏、小程序、H5等。且Android设备无需ROOT,iOS设备也无需越狱,能非常高效地解决两大系统测试分析的难题,提高测试工作的效率。
这里是官方教程。
开发环境
- Intel(R) Core(TM) i7-6567U CPU @3.30GHZ 3.31GHz
- 8.00GB RAM
- Windows 10, 64-bit (Build 17763) 10.0.17763
测试环境
- Qualcomm(R) Snapdragon(TM) 630
- 4.00GB RAM, 64.00GB ROM
- Android 9.0 (Pie)
- 1080 x 2520 pixels, 21:9 ratio, 6.0 inches, IPS LCD capacitive touchscreen
- 2870 mAh Battery
虽然是今年春季发布的新机器,但是配置非常之低,索尼大法诚不坑我…不过,卡牌类游戏对设备要求低,玩家Android多低端设备多样性带来设备适配问题,因此使用这台手机(就不仅是因为穷)所得到的测试结果也十分有参考意义。
测试用例
我针对FGO的QP(打开宝物库之门)副本设计了一个自动化脚本。详细的脚本内容和完整测试视频已经放在开头的链接里,可自行查看。
下图是我使用的队伍编制。由于自动化测试过程中我希望尽量避免考虑额外的情况,因此没有使用热门的双CBA+狂兰/伯爵的配置(依赖好友助战)。这个配置的方便之处在于,三轮战斗都只要靠丢技能和宝具就可以过关,不依赖于指令卡、助战和Master技能。
下面是一个完整的测试的流程图,这样安排技能和宝具的顺序可以最大化输出。
graph TB
N((进入游戏))-.手动.->L
L--体力足够-->Y[选择助战]
L--体力不足-->M[吃苹果]
M-->Y
Y-->Z[确认战斗编制]
Z-->A[艾蕾2技能]
subgraph 第1轮
A-->B[艾蕾3技能]
B-->C[弓凛1技能]
C-->D[艾蕾宝具]
end
subgraph 第2轮
D-->E[小莫1技能]
E-->F[小莫3技能]
F-->G[弓凛3技能]
G-->H[小莫宝具]
end
subgraph 第3轮
H-->I[弓凛2技能]
I-->J[弓凛宝具]
end
J-->K[奖励结算]
K-->L[副本选择页]
性能指标
使用的PerfDog工具在Android平台下,支持对以下数据的收集:
- ScreenShot(只支持USB模式)
- FPS(1秒内游戏画面或者应用界面真实平均刷新次数,俗称帧率/FPS)
- Avg(FPS):平均帧率(一段时间内平均FPS)
- Var(FPS):帧率方差(一段时间内FPS方差)
- Drop(FPS):降帧次数(平均每小时相邻两个FPS点下降大于8帧的次数)
- Jank(1s内卡顿次数。iOS9.1以下系统暂时不支持。类似Android的Jank卡顿和iOS的FramePacing平滑度统计原理。帧率FPS高并不能反映流畅或不卡顿。比如:FPS为50帧,前200ms渲染一帧,后800ms渲染49帧,虽然帧率50,但依然觉得非常卡顿。同时帧率FPS低,并不代表卡顿,比如无卡顿时均匀FPS为15帧。所以平均帧率FPS与卡顿无任何直接关系)
- BigJank:1s内严重卡顿次数
- ank(/10分钟):平均每10分钟卡顿次数。
- BigJank(/10分钟):平均每10分钟严重卡顿次数
- FTime(上下帧画面显示时间间隔,即认为帧耗时)
- Avg(FTime):平均帧耗时
- Delta(FTime):增量耗时(平均每小时两帧之间时间差>100ms的次数)
- CPU Usage(Total整机/App目标进程,统计结果和Android Studio Profiler一致)
- CPU Clock(各个CPU核心的频率和使用率)
- Memory (PSS Memory,统计结果和Android Java API标准结果一致,与Meminfo也一致。注:部分三星机器系统修改了Meminfo底层统计方式,导致Meminfo与Java AP统计结果不一致,新出三星机器已修复)
- Swap Memory (Swap Memory,部分设备支持Swap功能,在启用Swap功能后,系统会对PSS内存进行压缩,Swap增加,PSS会相应减少,由于压缩会占用CPU资源,同时相应会导致FPS降低)
- Virtual Memory(VSS)
- Memory Detail(NativePSS、GFX、GL、Unknown)
- GPU Usage(目前仅支持部分高通芯片手机)
- GPU Frequency(目前仅支持部分高通芯片手机)
- Network(Recv/Send)
- CTemp(CPU温度)
- Battery Power(Current电流、Voltage电压、Power功耗)(注:与仪器测试误差<3%左右)
- Log日志采集(WIFI模式下,不支持Log收集)
结果分析
由于(2019-12-21晚上八点半左右)打开游戏的时候游戏有一个更新,因此采集到的数据前5分钟是没有在运行自动化测试的,实际上自动化测试运行了大约二十分钟。
此处为游戏的帧率数据,可以看到帧率在11~30之间抖动。由于帧率的数据比较密集,我们结合下面CPU的数据进行分析。
可以发现在游戏运行的过程中CPU占用大致在50%左右,但是偶尔会有几处占用会飙升。我们结合之前帧率的数据,进行分析。
选择一个比较有代表性的时间点。在13:10,即自动化测试开始运行到第8分钟的时候,CPU占用有一个高峰点,对应时刻的帧率下降、抖动的也比较厉害。让我们打开自动化脚本的运行日志,检查一下。
和预期的一致,此处在运行的是艾蕾的宝具动画。由于FGO虽然是一款2D卡牌游戏,但是他的宝具动画实际上是使用3D渲染的(真·纸片人),因此在运行宝具动画的瞬间对计算性能的压力是比其他状态下要高的。
此处为游戏的内存占用数据。可以看到,游戏在主界面的内存占用大概在600M上下,进入副本后的占用会升到700M。
由于使用的工具不支持对我的手机的GPU运行数据的收集,这里没有GPU的数据。
此处为游戏运行时候的网络占用情况。可以看到,除了刚开始打开游戏时候的一波更新占用了一些流量外,卡牌类游戏在运行的时候其实是不怎么吃流量的,游戏大部分的工作都是在本地客户端渲染完成。
由于手机是通过USB调试连接到我的笔记本上的,因此实际上是一直在充电的,电量消耗情况没有参考意义。不过,就事论事,PerfDog这个工具本身是支持wifi下远程数据收集的,只是Airtest工具限制了我需要用USB连上笔记本。
遇到问题以及解决方法
同时开两个测试工具抢占ADB导致其中一个连接失败
被这个问题卡住了很久,后来发现网易的Airtest支持调整ADB连接模式,我调整成“Use javacap”之后就没问题了。
自动化测试的时候界面元素加载时间不确定
一开始我的解决方法是sleep()
足够长的一段时间。(好蠢)
后来看了官方的文档,使用了touch(wait(v,timeout))
的方法,这样就可以等待界面元素出现之后点击了。
艾蕾2技能和小莫1技能图标一样
我是使用OpenCV的图像匹配来定位界面元素位置的。然而,艾蕾和小莫的2个技能图标是完全一样的,因此对于她们的技能我需要手动定位到准确的坐标值上。
人物长得太像导致OpenCV匹配指令卡错误
众所周知,枪凛艾蕾和弓凛是两个角色,但是她们长得非常像doushiwolaopo。在最开始的几次测试中,我遇到了OpenCV将她们的宝具卡和指令卡认错,导致自动化测试进入死循环的情况。比如在下面这个场景中,由于发牌员的恩赐同时有六张长得非常相似的指令卡出现,很容易导致匹配错误。
我的解决方法是:选择界面中识别性较高的部分进行图像匹配。比如这里我是选择了宝具文字部分。
运行测试一段时间之后游戏体力不足
根据体力是否足够,增加了一个是否吃苹果(体力恢复道具)的预判。
改进方向
由于时间所限,我只实现了最基本的自动化测试脚本。事实上,只要时间允许,增加一些代码,我还想实现以下功能:
- 选择有满破蒙娜丽莎礼装的充能技能满级CBA好友助战(收益最大化)
- 增加一些别的副本支持
- 优化脚本(当前脚本运行一轮大概要五分钟,比自己手刷三四分钟的平均时间是要慢的)
- 增加自动化的程度,比如从打开游戏开始(要判断是否有更新、登陆界面、游戏公告、签到礼包等等…)
- 增加容错脚本,比如如果突然收到短信点错了…
一开始我想做的改进方向只有一两条,但是真的写下来却发现越写越多…写到最后我是不是真的可以百分之百的让机器替我玩游戏了呢!laopohaishizijide
实验感想
通过本次作业,我得以以一个游戏测试人员的角度重新看自己玩的游戏。一直以来,FGO的界面卡顿就饱为玩家们所诟病,这一次的测试算是实锤验证了这一点。我觉得,这门课上学到的东西应用在自己的实践中的这段过程是非常有趣的,也确实让人学到了很多。
一个额外的收获是我以后刷QP岂不是都可以【手动狗头】…
总的来说,由于是自己正在玩的游戏,本次作业让我写的格外有动力!感谢这门课程给我的这次机会,也感谢网易和腾讯开发的非常好用的工具~