性能测试是一名高级工程师必备的技能之一,也许你在工作中用不到,但至少需要对相关内容进行了解。结合我的实际工作,对性能测试进行阶段性总结。性能测试需求,我将它分成两大模块,一部分是产品迭代过程中对性能优化(逆化)判断,从而为开发提供性能瓶颈和优化方向;另一部分是产品对比,一般是竞品之间的性能对比,找到与竞品之间的差距,通过技术定向优化赶超竞品,优化体验。
在性能测试过程中如何判断性能优化或逆化,需要选定对应比较版本,在数据采集过程中,至少有两组数据,实验组和对照组。简单点说就是实验组数据与对照组数据进行对比,看性能变化。实验组和对照组采集数据,在操作中我们需要严格控制好变量,确保收集的数据是有效的。还有一种是根据性能标准来看获取的性能数据是否符合标准,具体标准需要结合不同场景和设备硬件给出相应标准。
性能优化的结果其实也可以细分为整体性和局部性能。游戏中场景多,优化和逆化有时候从宏观的角度是很难说明性能差异的,因此,整体性能有时候并不能反馈出游戏中某些卡点。比如多人在线竞技场景,对手机性能要求更高,在测试过程中,如果性能波动会比较大且性能数据采集过程中,这部分采集不充分。而其他性能指标良好的情况下,采集时长充分,该性能在整体性能数据下是可接受的(性能不好的部分被平均,看起来就比较好)。但是,并不意味着不存在性能卡点问题,因此,我们在做性能测试过程中需要对局部性能,特别是容易出现性能问题的场景进行单独的性能数据收集,以确保最终的性能报告是客观完整的。
需求:性能测试优化点是什么?
需求获取方式可能是文档,我们可以通过对文档内容进行理解,但是文档内容于实际已经开发是否一致需要与对应开发进行确认。确认目前已经完成的性能测试优化点需求。
分析:如何才能将优化点通过工具将性能指标获取到?
分析在性能测试过程中很重要,决定了测试策略和具体步骤,是否能够获得有效性能指标的关键。在着手测试前,需要结合经验和对需求的理解,制定测试策略和测试步骤。
通过分析,我们可以得出测试策略以及测试方法。为后续收集数据和分析打下基础。
场景:在测试过中如何选取测试场景?
测试场景其实依赖于需求,需求优化场景是我们主要关注的对象。在实际测试中测试场景主要是集中在主要的玩法上。我们需要收集主要玩法在游戏过程中的性能变化曲线。还需要额外收集一些特殊场景的内存进行分析,例如PvP战斗结束,公共场景待机,战斗中等。
主要玩法:关注的性能指标如FPS,内存,CPU,GPU,流量等相关指标。该部分是游戏的主体卖点,性能各项指标决定了玩家的游戏体验。
其他玩法:如待机,公共场景待机,休闲,结算等也需要对内存进行关注,避免长时间待机内存过大导致内存溢出而崩溃的问题。以及在战斗场景结束后,大量的堆栈内存释放。因此,需要对结算界面进行关注,避免内存释放导致消耗。loading 时间,场景loading时间长短对于玩家的体验至关重要,可以同类型游戏横向对比loading时长。
操作:在测试过程中,如何避免无效数据收集?减少测试成本?
操作也是整个性能测试的关键,如何控制变量?这里的变量是多维度的,硬件状态(如温度),程序状态(如不确定算法或场景随机性)都会导致每次执行的结果均有一定偏差。
数据分析:如何在采样数据中有效甄别有效数据?
数据分析是基于需求本身的性能优化点针对性分析,比如任务【无尽模式无阴影优化】主要优化手段是对拖拽处理逻辑。我们在设计好数据采样场景后(尽可能保持一致的操作路径,减少变量),采样需要只针对于拖拽场景。如下图分析时应该分为前后两端去验证数据,中间非拖拽导致的帧率变化需要排除。
从前半段为新手流程的拖拽可以看出,开启特性的形况下平均PFS明显高于关闭的时候:
从后半段为非新手流程的首次拖拽分析得出的结论依旧,开启特性的形况下平均PFS明显高于关闭的时候:
总结两次采样控制非常好,从图形上看走势基本保持一致。这样的情况从整体的平均数也能一定程度反应拖拽优化的性能优化,但说服性相对于只分析拖拽带来的变化更弱,且想在实际的操作中做到如此接近的场景所消耗的测试采样时间更久,更困难。因此,在数据采样和分析中学会有效分析和选取数据是提高效率的核心手段。该案例是在原来设计的测试用例下对已收集数据进行的数据有效性分析。可以适当增加对该优化方案更直接针对测试,设计只拖拽场景(不进行放置块),控制被拖拽的块一致,时间上可以适当增加如30s或60s。然后对期进行数据分析。另外,还可以结合特殊场景,合理利用冷启动的边界场景覆盖全面。测试点如下:
场景 |
测试方法 |
数据分析 |
1、冷启动,首次完成新手和非新手流程拖拽 |
每个块在盘面拖拽时间控制在30s左右,沿着盘面顺时针或逆时针画圈 |
拆分两次数据单独做分析 |
2、接上,冷启动,非首次拖动 |
先放置一个块,在放置后续块时拖拽块,沿着盘面顺时针或逆时针画圈,收集相关性能数据,时间控制在30s左右 |
|
3、接上,冷启动,整体性能影响,模拟玩家正常体验游戏 |
按照正常游戏进行块的放置,游戏时间可以控制在3分钟左右 |
|
接上,对照实验,再不开启该优化的情况下测试对应场景1,2,3的性能数据 |
重复上述场景对应的方法 |
对照组和实验组数据对比,观察优化前后的性能变化 |
用例模板:
性能指标:
性能指标都有哪些,从何而来?如何判断这些指标是准确的?性能指标及其标准定义需要结合用户体验、硬件限制和行业标准白皮书。
-
性能指标标准的定义方法:
- 行业参考与竞品分析
- 用户场景与设备限制
- 量化分级标准
-
核心性能指标
- 流畅性指标
- 帧率(FPS):每秒渲染帧数,直接影响画面的流畅度。
- 标准:静态画面≥24FPS(电影帧,人眼连贯性阈值),动态操作≥60FPS(理想值)核心玩法90%要达到这个标准,复杂场景不低于30FPS
- 补充:游戏中有静态页面,一般情况下游戏内部FPS值保持在60PFS是最稳定的,低端设备也需要达到最低的30PFS以上。特殊场景如动画/剧情,电影级内容通常采用24-30FPS(电影标准),若性能允许也可以升至60FPS。
- 卡顿率:卡顿帧占比(单帧耗时超平均2倍且>16.66ms)
- 标准:高端机≤2%,低端机≤10%
- 帧率(FPS):每秒渲染帧数,直接影响画面的流畅度。
- 资源消耗指标
- CPU占用率:逻辑计算与渲染人物消耗的CPU百分比
- 标准:空闲状态接近0%(后台挂机),中等负载≤30%(常规操作),高负载(如战斗)≤50%。
- 补充:空闲状态指将应用切换至后台,停止所有用户交互,进入待机状态,测试时收集30s以上数据。中等负载,执行操作操作如点击、页面切换,持续5到10分钟,监控CPU波动。高负载,触发游戏核心玩法或极限操作(战斗或复杂的特效场景),一般CPU占用需要≤50%,部分高帧率游戏可接受小于等于80%。测试时连续运行高资源消耗功能,记录峰值CPU使用率及稳定性。
- 内存占用:物理内存(PSS)与内存泄露
- 标准:PSS不超过系统总内存的30%,内存泄露需通过工具(如LeakCanary)实时监测
- 补充:VSS虚拟内存总量(含未分配物理内存)包括所有虚拟地址空间,通常远大于实际物理占用,用途有限。RSS实际物理内存(含全部共享内存)可能高估进程内存,因共享内存重复计算。USS进程独占物理内存仅统计私有内存,用于检测内存泄漏。PSS表示进程实际使用的物理内存,其中共享内存(如共享库)按比例分摊到所有使用该内存的进程。PSS通过比例分配共享内存,解决了RSS的重复计算问题,是评估进程实际内存占用和系统整体内存压力的核心指标。但在分析内存泄漏时,需结合USS(独占内存)进行精准定位。
- GPU负载:渲染管线压力(如DrawCall、三角形数)
- 标准:DrawCall ≤500,三角形数≤50万/帧
- 补充:GPU利用率低但帧率不足,CPU瓶颈或数据传输延迟 ,增加分辨率以平衡负载,关闭后台进程 ;Overdraw过高 ,半透明物体过多 ,减少粒子数量,合并UI图层;GPU带宽持续高位,纹理未压缩或分辨率过高,使用ETC2/Astc压缩,优化Mipmap层级;片元处理单元过载,复杂Shader或UI密集,简化Shader计算,减少全屏后处理效果。
- CPU占用率:逻辑计算与渲染人物消耗的CPU百分比
-
稳定性指标
- ANR(无响应):主线程阻塞超过5秒(Android)
- 崩溃率:崩溃次数
- 标准:通用目标≤0.1%,金融类app需≤0.01%
-
启动与加载效率
- 页面加载时间:用户到内容完全展示
- 标准:核心功能(如支付)≤1秒
- 冷启动时间:从点击图标到首帧渲染完成
- 标准:≤1.5秒(行业通用)
- 页面加载时间:用户到内容完全展示
-
能耗与发热
- 功耗:单位时间电量消耗
- 标准:视频类App≤15%/小时,王者(5%-10%)/小时,原神(8%-18%)/小时、和平(5%-18%)
- 补充:功耗与硬件性能,画质和后台活动均有关系。可以根据游戏类型参考以上功耗数据。优质游戏App≤10%(中画质)
- 功耗:单位时间电量消耗
-
网络性能
- 流量消耗:单位时间流量消耗
- 标准:王者(50-200MB)/小时,原神(80-200MB)/小时,和平(50-150MB)/小时。
- 补充:开启语音功能会增加约20%的流量。画质降低,帧率降低也可以减少流量的消耗。云游戏流量消耗较高,约2-4GB/小时
- 延迟与丢包:弱网环境(2G/3G)下,核心功能可用
- 流量消耗:单位时间流量消耗
-
性能指标示例:
- 流畅性指标
其他:不同的测试需要需要不同的设置和关注点
性能测试指标不同,测试方法本身也会存在差异。
补充知识:冷启动和GM命令生效重启的差异?
冷启动是游戏从关闭状态切换到活跃状态的过程,整个过程有资源加载,程序初始化,编译等。
GM重启,可能是针对性的activity或者进行的重启,重启过程中,会跳过冷启动的编译和部分程序初始化过程,存在数据残留风险。
因此,我们在测试游戏启动耗时时,不能使用GM指令进行重启,这种重启与冷启动是存在差异的,收集的数据不能准确体现现阶段的性能情况。
维度 |
冷启动 |
GM指令生效后的重启 |
进程状态 |
完全终止并重新创建进程 |
可能保留部分进程或线程 |
资源加载 |
重新加载所有资源 |
可能仅加载部分资源或场景 |
数据初始化 |
全局变量、角色属性等重置 |
可能保留GM指令修改的数据 |
启动时间 |
较长(需要初始化所有组件) |
较短(跳过部分流程) |
评论前必须登录!
注册