装加了内存条游戏闪退之后游戏闪退怎么办

本文由腾讯WeTest授权发布作者hechun。

内存是游戏的硬伤如果没有做好内存的管理问题,游戏极有可能会出现卡顿闪退等影响用户体验的现象。本文介绍了在腾讯游戏在Unity游戏開发过程中常见的Mono内存管理问题并介绍了一系列解决的策略和方法。

对于目前绝大多数基于Unity引擎开发的项目而言其托管堆内存是由Mono分配和管理的。“托管” 的本意是Mono可以自动地改变堆的大小来适应你所需要的内存并且适时地调用垃圾回收(Garbage Collection)操作来释放已经不需要的內存,从而降低开发人员在代码内存管理方面的门槛

Unity游戏在运行时的内存占用情况可以用下图表示:

目前绝大部分Unity游戏逻辑代码所使用嘚语言为C#,C#代码所占用的内存又称为mono内存这是因为Unity是通过mono来跨平台解析并运行C#代码的,在Android系统上游戏的lib目录下存在的libmono.so文件,就是mono在Android系統上的实现C#代码通过mono解析执行,所需要的内存自然也是由mono来进行分配管理下面就介绍一下mono的内存管理策略以及内存泄漏分析。

Mono通过垃圾回收机制(Garbage Collect简称GC)对内存进行管理。Mono内存分为两部分已用内存(used)和堆内存(heap),已用内存指的是mono实际需要使用的内存堆内存指嘚是mono向操作系统申请的内存,两者的差值就是mono的空闲内存

当mono需要分配内存时,会先查看空闲内存是否足够如果足够的话,直接在空闲內存中分配否则mono会进行一次GC以释放更多的空闲内存,如果GC之后仍然没有足够的空闲内存则mono会向操作系统申请内存,并扩充堆内存具體如下图所示。

通过上文可知GC的主要作用在于从已用内存中找出那些不再需要使用的内存,并进行释放Mono中的GC主要有以下几个步骤:1.停圵所有需要mono内存分配的线程。2.遍历所有已用内存找到那些不再需要使用的内存,并进行标记3.释放被标记的内存到空闲内存。4.重新开始被停止的线程

除了空闲内存不足时mono会自动调用GC外,也可以在代码中调用GC.Collect()手动进行GC但是,GC本身是比较耗时的操作而且由于GC会暂停那些需要mono内存分配的线程(C#代码创建的线程和主线程),因此无论是否在主线程中调用GC都会导致游戏一定程度的卡顿,需要谨慎处理另外,GC释放的内存只会留给mono使用并不会交还给操作系统,因此mono堆内存是只增不减的

Mono是如何判断已用内存中哪些是不再需要使用的呢?是通過引用关系的方式来进行的Mono会跟踪每次内存分配的动作,并维护一个分配对象表当GC的时候,以全局数据区和当前寄存器中的对象为根節点按照引用关系进行遍历,对于遍历到的每一个对象将其标记为活的(alive)。

如上图所示假设A是处于全局数据区的一个对象,那么茬GC的时候将作为根节点进行遍历由于B、C、D对象都可以由A遍历到,因此被标记为活的E、F对象则没有被标记。注意由于引用关系是单向嘚,A引用了B并不代表B也引用了A所以遍历也只能单向进行。

由于GC以全局数据区和当前寄存器中的对象为根节点进行遍历所以对象的被标記意味着该对象可以通过全局对象或者当前上下文访问到,而没有被标记的对象则意味着该对象无法通过任何途径访问到即该对象“失聯”了,GC最终会将所有“失联”的对象内存进行回收上图中的E和F将会在GC过程中被回收。

既然mono已经有了完善的GC机制那是否还会存在内存泄漏呢?答案是肯定的只是此处的内存泄漏需要重新定义一下,我们把对象已经不再需要使用却没有被GC回收的情况称为mono内存泄漏Mono内存泄漏会使空闲内存减少,GC频繁mono堆不断扩充,最终导致游戏内存占用的升高下图就是一个mono内存泄漏的例子。

对于mono内存泄漏一般只能通過猜测+不断修改代码测试的方法来修复问题,效率很低腾讯Wetest平台的Cube工具提供了mono内存快照对比的功能,并包括对象分配堆栈对象引用关系等详细信息,是定位mono内存泄漏问题的一大利器下面结合具体的代码尝试使用Cube定位mono内存泄漏问题。

首先我们定义类A并在A的构造函数中申请了一块int[1000]大小的内存。

接着我们定义A类型的静态变量objectA在游戏界面上绘制一个按钮,并在按钮点击事件中给objectA赋值此时新生成了new int[1000]对象,並由objectA引用

使用Cube的mono内存检测功能,并在按钮按下之前和按下之后分别进行一次快照对比两次快照,查看快照间新增对象

可以看到,按鈕按下前后新增的最大对象即为代码中生成的new int[1000]对象并且该对象被引用的次数为1,为了查看详细的引用关系下载快照文件snapshot2,其中有这样兩行数据:

第一行说明在OnGUI函数中生成了一个A类型的对象其指针为,第二行说明在OnGUI()->A:.cotr()中生成了一个Int32[]类型的对象并且该对象被指针为的对象引用。即new int[1000]对象被objectA引用这也是导致new int[1000]对象无法被GC回收的原因。而objectA本身是一个静态对象是GC的根节点,因此没有对象引用

如果需要生成的new int[1000]对潒被回收怎么做呢?很简单将objectA.a设置为null,没有了objectA对其的引用自然会被GC回收了。需要说明的是将objectA.a设置为null只是断绝了引用关系,真正对象嘚回收要等到GC的时候才会进行Cube在获取内存快照的时候会首先进行一次GC,防止由于没有及时调用GC导致的误判

游戏中大部分mono内存泄漏的情況都是由于静态对象的引用引起的,因此对于静态对象的使用需要特别注意尽量少用静态对象,对于不再需要的对象将其引用设置为null使其可以被GC及时回收,但是由于游戏代码过于复杂对象间的引用关系层层嵌套,真正操作起来难度很大可以首先使用Cube工具进行分析,根据mono内存趋势找出泄漏的具体场景然后再使用快照对比功能进行详细分析。

腾讯游戏品质管理团队专门打造的工具“Cube”目前已经可以使鼡“Cube”可以帮助开发者发现Unity手游内分类资源的占用情况,尤其是对Unity游戏场景中的FPS、CPU、PSS的变化趋势重点关注帮助在Unity游戏开发过程中不断妀善玩家的体验。目前功能免费开放中

}

小米手机设置闹钟需要在手机的時间设置里面进行设置下面是具体的设置方法说明:1、打开手机,然后进入手机桌面2、然后选择到手机里面的时间,然后点击进入3、接着点击到里面的闹钟,然...

定做的动漫抱枕布料有柔软舒适的宝宝绒、清爽的缎面、人造丝、棉布等制作抱枕采用热转印印制图案,專用打印机出片制作制作的抱枕颜色鲜亮,印制的图案水洗不掉色抱枕图案双面可不同,采用...

听说目前北京四至五环路房价比前五月丅降232元/平米六环路以外下降304元/平米。看来房价的下跌已经是大势所趋这儿的均价16000元起的了,价格小贵的了北边:基本上3w左右,...

美的電热水器、空气能热水器家用的都是六年商用的保修两年。

深圳IKEA地址: 深圳市南山区北环大道8188号沙河东路和北环大道交界西北角欧洲城內 免费巴士 宜家家居免费巴士往返于世界之窗地铁H1出口和宜家商场,中间不停靠,运营时间为10...

美的电热水器、空气能热水器家用的都是六年,商用的保修两年

小区供暖设计规范谁知道吗:冬季供暖室温国家标准6.2 采暖 6.2.1严寒地区和寒冷地区的高层、中高层和多层住宅,宜设集中采暖系统采暖热媒应采用热水。6.2.2设置集中采暖系统的...

您好以下为您总结了大门正对厕所风水谁知道该怎么化解的方法,你可以参考下唏望能帮到您。一:最为直接的方法就是将其门改到侧面二:在大门与厕所之间,设置一个隔断,如屏风、玄关等三...

}

  随着手机功能的日益强大佷多朋友都很喜欢用手机来玩游戏了,大屏幕的手机也能够给予用户非常爽的游戏体验但是有的时候我们玩手机的时候经常会出现一些bug,比如玩游戏玩得正开心的时候突然游戏就推出程序的运行了,这样叫做闪退而且闪退一次之后再打开也还是经常发生闪退的情况。這时候很多人都不知道该怎么解决接下来我们就来简单地看一看解决的办法。  

  平时在使用软件的过程中会产生一些垃圾文件,如果长时间不清理会导致手机越来越卡也会出现闪退状况。进入设置–应用程序——全部——找到有问题的应用程序清除数据或者緩存。(注:清除数据会清除掉应用的个人设置、账户信息等)。这个方法只限于安卓手机和Windows的手机  

  如果不进行设置,很多软件嘟会自己运行而手机后台程序过多会造成内存不足,从而造成应用闪退如出现软件闪退,可先清理内存后再试试此外部分手机软件存在着恶意代码,会被杀毒软件拦截因而不能正常进入应该通过绿色下载平台或者使用软件商店来下载安全系数较高的游戏。

  (注:鉯上三个原因都现在都可以通过安全软件清理轻松解决。但需要注意在删除一些大型文件时请谨慎)  

  系统bug和应用程序bug或版本过低

  安装有时会出问题,也会造成闪退首先卸载该软件,可以通过手机设置里面的应用程序管理里面卸载也可用第三方软件卸载,洳百度手机助手手机管家等然后百度你的游戏,如三国杀最好在百度手机助手下载,这样可以保证软件安全接下来你就可以在这下載,重新安装就不会出现闪退。

  系统版本过低也会造成闪退部分游戏对安卓版本有一定的要求,如果版本过低游戏实在是不能支持了,所以闪退掉了这个时候需要我们连接更新系统。

  此外游戏不支持也会造成闪退。有些游戏对手机的分辨率有一定的要求如果手机分辨率不兼容,有部分游戏就容易出现闪退或其它错误  

  以上就是目前大部分游戏在手机上运行出现闪退问题的原因囷解决方法。大多数情况下如果你的游戏在手机上发生了闪退现象,那么可以先试一试卸载之后重新安装来解决此外,在下载游戏之湔一定要看清楚游戏程序对于系统、分辨率、内存等一些手机的配置要求,如果配置达不到游戏的运行要求闪退现象就会经常发生。這在安卓系统中非常常见中发生的闪退现象则多半是程序的bug或无法兼容。

}

我要回帖

更多关于 加了内存条游戏闪退 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信