gzyueqian
13352868059

Unity如何解决游戏中的卡顿问题?

更新时间: 2019-12-31 15:46:53来源: 粤嵌教育浏览量:21561

   游戏现在已经成为大家社交、解压的一种方式了,可以说现在的游戏已经融入到人们生活中的点点滴滴了。对于游戏的游戏肯定也是越来越高了,对于在玩游戏的时候大家都不想回出现有卡顿的问题的,那么unity如何解决游戏中的卡顿问题呢?怎么样才可以让顾客的体验更好呢?

  1、首先,先要了解下什么是Mono内存


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


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


  2、然后,来了解什么是Mono内存管理策略


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


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


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


     3、重新开始被停止的线程。


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


  4、,要了解什么是Mono内存泄漏


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


  解决办法


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


  以上就是粤嵌科技的unity培训的讲师给大家讲解的关于unity如何解决游戏中的卡顿问题,如果说你想要学好unity技术的话,那么还是要先把以上粤嵌科技的讲师给大家所讲解的内容理清。粤嵌科技欢迎每位想要学习unity技术的学员来我们公司的unity培训班进行实地考察,获取是也可以点击我们文章下面的获取试听资格按钮来获取我们的unity培训免费试听资格,来和我们的讲师进行面对面的交流和互动。

免费预约试听课