乐趣区

关于游戏:游戏客户端性能内存前篇

原文由 5t5 发表于 TesterHome 社区,原文链接

内存问题——落叶归根🔰

内存,大家最相熟不过的一块内容,也可能最不理解的一块内容,相熟是因为听到这个词的频率十分高,【啊,我内存不够了,手机好卡啊】这是我听到过最多的吐槽,不相熟是,内存怎么工作,内存的数据交换过程中都谁参加了,内存对于设施来说,如果呈现极其场景的话,设施会有什么影响?等等.. 等等.. 一堆的问题都如同跟内存相干,明天就依照测试向去了解探讨下内存在客户端性能中的一面。

展现形式📌

1、内存的迷信解释(摘百度)哈哈;
2、内存在性能测试中的表现形式;
3、内存的类型以及含意;
4、内存的非凡体现有哪些?
5、内存数据在版本迭代过程中表演的角色以及重要性;

迷信解释🚢

内存 (Memory) 是计算机的重要部件之一,也称内存储器和主存储器,它用于临时寄存 CPU 中的运算数据,与硬盘等内部存储器替换的数据。它是外存与 CPU 进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体施展的程度。只有计算机开始运行,操作系统就会把须要运算的数据从内存调到 CPU 中进行运算,当运算实现,CPU 将后果传送进去。

内存在性能中的体现🚁

内存透露【重点关注】
首当其冲,内存透露问题堪称是听的最多,导致挪动端解体闪退的状况最多的首恶之一,内存透露问题上,初步接触性能测试的人员始终存在一个误区,那就是在测试过程中,内存始终处于回升状态是不是就是产生了内存透露问题?答案是否定的,咱们先来看看游戏客户端性能的过程中产生内存透露时,如何正确判断产生了透露。

解释下失常透露时的起因
图中能够看出在特定的某个场景,内存申请是绝对固定的状况,却每次应用该场景时援用的资源脚本,有固定的几个内存对象脱漏,随着应用该场景次数的减少,内存的值会有轻微 / 重大的增长,并且不会被革除,这部分内存就是透露造成的。图中的 5MB 就是透露的内存。

透露时测试的执行伎俩以及罕用场景
举个栗子,正本透露测试,能够发现每次从正本返回之后内存的基准值在一直的回升,这就意味着正本中有资源 / 代码堆未卸载洁净,有透露,这样的话,正本的透露测试问题就定位进去,而具体的内存透露是什么?见下一章

延长:正本透露测试如此,触类旁通,其余的透露问题同样实用,如:UI 透露测试,频繁关上敞开 UI 跳转界面,查看体现,跑马灯测试,频繁的唤起跑马灯内容,查看内存变动,都是能够的。

内存基数高

内存基数过高就很简略了,是针对于内存调配极度不合理的情详情去看的。
举个栗子,查看下图,咱们发现在登录界面时,内存就曾经飙升到 500MB,而进入外围的场景后才 650MB,重大阐明,登录阶段存在重大的内存调配不合理的状况。须要优化,后续须要针对性的把资源占用较大的内容优化或者删除。

内存峰值

内存峰值也绝对简略,然而又属于比拟重要的局部,因为它是评估我的项目在设施上是否存在解体危险的一个指标。
举个栗子,咱们来看一下,每个我的项目咱们在跑完外围流程的过程中,内存值都会存在一个最大值,这个值就是内存峰值,内存峰值的呈现意味着我的项目可能达到的一个极限值,上回咱们也说到,硬件决定我的项目的下限,如果内存过高超过下限,设施就会干掉我的项目,峰值的意义就是如此。

延长:比方 iOS 设施就是 1G 运存机型,645~649MB 就会杀掉过程,2G 运存机型,1400MB 就会杀掉过程。Android 设施也存在相似的景象,然而当初机型都解禁,底层内存不足会优先杀掉未应用队列过程,波及底层调度问题后续介绍。

内存冗余

顾名思义,就是这部分的内存是多余的,而且它大多会响应在开发中最罕用的池利用,以及需要变动的过程中。内存冗余就绝对简单一些,了解会好了解,定位会麻烦且简单一些,具体定位形式放后篇。

内存类型以及含意💡

VSS : Virtual Set Size 虚构耗用内存(蕴含共享库占用的内存)
RSS : Resident Set Size 理论应用物理内存(蕴含共享库占用的内存)
PSS : Proportional Set Size 理论应用的物理内存(比例调配共享库占用的内存)
USS : Unique Set Size 过程单独占用的物理内存(不蕴含共享库占用的内存)

罕用的就只有 VSS 与 PSS 两个,虚拟内存在测试过程中用来判断申请内存时的一个内存状态,PSS 则是实在运行我的项目时,实在所占用的我的项目资源 + 我的项目代码堆 + 三方库 / 零碎库援用时占用局部的内存是最实在反馈。前者因为虚构基址 Google 官网有限度为 0~4G 避免出现杀过程的状况,后者则就是咱们最常看的内存值。

介绍 PSS 内存中不同类型
咱们晓得 Perfdog 中 memory detail 栏内存类型取自 adb meminfo 的内存类型,然而取值上会有些差异,前期感兴趣的能够给各位留个作业,看一下,内存类型不同在哪里?取值有差别时是什么起因?

Perfdog memory detail 如下图展现

adb dumpsys meminfo {}获取指标如下展现

上图中咱们发现,meminfo 的内存类型很多,Perfdog 取内存类型时,并没有全副都取,而是取到了一部分,而这部分根本就够用了,也跟 TX 自身游戏我的项目多用于 Unity 引擎有肯定的关系。因而咱们只须要了解其中一部分大头内存类型即可,足以疾速定位到很多内存问题。
非凡揭示:感兴趣的能够延长的去里理解 meminfo 中的内存类型都是什么意思,这个不多赘述了。

从上图中能够看出内存的类型罕用并且要察看的就是:
NativePss: 我的项目中常驻内存,蕴含的就是罕用资源文件,库文件,以及脚本文件;
Gfx/GL:反映的基本上就是渲染底层驱动给到的内存,我这里个别就认为是 ” 显存 ”,他们具体的区别这里我也没有深究,只晓得不同的设施取值时,时而是 Gfx,时而是 GL,因而我猜想都是显存了解,如果有出入,欢送交换;
unknow: 在 Unity 我的项目中个别就了解为 Mono 堆,其余我的项目未延长去了解,感兴趣的仍然能够去拓展延长的理解。

内存的非凡体现【不分先后】✈

内存压缩
内存值中存在内存替换区域,名为 swap,用来压缩缓存,保留不罕用 / 通用内存,它属于底层调度的一部分,也是实在反馈在 PSS 内存中的,因而实在的内存计算规定是:内存 memory+ 替换内存 swap memory,如果一旦 swap memory 升高意味着有局部内存在后盾做压缩解决,而压缩的操作是由 CPU 来参加的,无疑减轻了 CPU 的开销,中低端机上就会体现出机身发热,卡顿的状况,后篇着重介绍。

显存升高
显存升高间接反馈的状况也是底层硬件调度机制无关,咱们目前只须要晓得显存是用来保留渲染数据产生的内存做缓冲去做预留,如果它升高意味着在传输 I/O 阶段存在瓶颈,须要优化渲染流程,后篇会着重解释。

内存值的表演角色以及迭代时利用🍆
表演角色
配角,妥妥的配角,它的影响关乎我的项目的生死,也是我的项目中重点关注的指标之一,上述的内存状况都要一一思考去评估,反馈在每次版本迭代中。
迭代利用
同上篇的晦涩度统一,能够在迭代过程中作为评估优化成果,竞品剖析等的一项掂量指标去做记录。

总结😆

综上所述
1、内存分多种类型,次要关注 PSS;
2、内存在不同体现下,场景不同,评估形式也不同;
3、内存在客户端性能中位置很高,也是重点关注的对象,须要认真去看,着重去剖析;
4、内存波及局部 I/O 阻塞,其余硬件不便的内容;


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

退出移动版