GameMonkey脚本编程基础——垃圾收集

 

作者:吴紫鄂(zewu@live.cn

GameMonkey当前支持两种不同的垃圾收集(GC Garbage Collection)机制,全(自动)垃圾收集(scan and sweep)和增量垃圾收集(incremental)。可以使用#define语句来指定使用哪种垃圾收集机制。

垃圾收集和引用计数不同,垃圾收集并不会通过保存外部信息来辨认对象是否处于被应用状态,这种信息是通过计算每一个垃圾回收循环过程从根元素开始遍历整个对象层级来获得的。所谓根元素(例如:线程和全局变量)将存储一些对象的引用信息,这个引用信息会一直访问到没有新的对象被找到。对象在每次引用的时候都会被打上一个标记(Mark),这样脚本语言在运行时就不会试着释放它们。等遍历过程接受后所有使用标记的对象将会被释放。这个过程被称为标记和清除(scan mark and sweep)。

全垃圾收集

标记和清除(scan and sweep)过程通过一步完成通常被称为“全垃圾收集”。全垃圾收集是一种简单有效的垃圾收集方式,缺点是当GC执行时会花费很长一段时间,时长常常是不可预知的,而且会占用占用CPU,可能对游戏的帧率造成很大的影响,算法流程如下:

1、当内存使用达到阀值的时候,出发GC执行

2、从对象继承树的根节点开始遍历所有对象

调用对象的Mark()函数对对象是否有效进行标记

递归Mark()所有该对象的所有子对象

3、迭代虚拟机中的所有对象,如果没有被Mark,则说明是无效的则调用Destruct()释放内存

增量垃圾收集

增量垃圾收集过程和全垃圾收集过程的区别是它的整个垃圾收集过程通过每隔几帧来进行若干垃圾收集过程来实现,这样就最大限度的减少了垃圾收集操作对帧率的影响。

GameMonkey增量垃圾收集还可以依照检查每次调用所获得的子对象的个数来定义,因此对于大型的对象层级结构的标记也不会使系统停滞太久。还可以通过内存限制来设定什么时候来运行垃圾收集器。一个软限制(Soft Realtime Incremental Garbage)会在超过数量的时候告诉虚拟机,这样就启动增量垃圾收集。还可以通过一个硬限制('Hard' realtime GC)来规定开始全垃圾收集的时机。

所有使用增量垃圾收集的对象必须实现下面的两个函数:

1、Trace() 被调用,添加其子对象到垃圾收集器

2、Destruct() 释放内存

禁用垃圾收集

如果有必要的话可以临时禁用垃圾收集,当GC被禁用时,如果GC正在执行,那么他将暂停,如果没有被激活则不会开始。禁用垃圾收集的主要出发点是为了应用程序同时分配多个对象并且这些对象并没有立即连接到其根对象。

小结

GameMonkey垃圾收集给用户留下了充分的发挥空间,用户可选择自由的订制垃圾收集,也可以使用全垃圾收集自动进行垃圾收集,当然做好的情况是用户使用软限制和硬限制配合起来进行内存管理。

参考

GameMonkey:http://www.somedude.net/gamemonkey/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值