Cocos、Lua游戏内存释放之我见

本文探讨了Cocos2d-x结合Lua开发游戏时的内存管理,特别是针对C++对象和Lua对象的释放。介绍了引用计数、autorelease在Cocos2d-x中的工作原理,以及Lua的垃圾回收机制和弱引用表的概念。建议关注观察者模式中的解绑、辅助工具类的引用管理、UI自动释放等方面,以防止内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列针对cocos2dx+Lua游戏开发,在本篇中主要Lua对象释放的姿势,避免造成内存泄漏,有写得不好或者写错的地方,麻烦大家帮忙指正。


介绍之前,我们先了解一下游戏运行时,最基本的内存占用。(这里的划分并不标准,只是为了形象介绍划分出来的)
1、贴图内存
2、代码运行内存

其中贴图内存主要包括贴图资源和字体资源。代码运行内存包括平台层,C++层,Lua层等,相对于贴图内存来说,占比较小,但往往一些写法用法不当或导致内存泄漏和贴图内存泄漏。

在这一课我们介绍的是C++对象以及Lua对象释放的姿势,其它的暂不作介绍。

cocos2dx移植于Objective-C,因此和OC一样使用了比较原始的引用计数的方法来管理内存,这里我们说一下Ref引用计数。

Ref(2.x中为CCObject)是引用计数的模型:
1、Ref抽象类(不能实例化,只能由子类实例化);
2、创建默认引用计数为1;// _referenceCount(1);
3、引用计数为0时,执行delete销毁。

  • retain

    引用计数加1,++_referenceCount

  • release

    引用计数减1,–_referenceCount

  • autorelease

    引用计数不变,放入自动释放池AutoreleasePool,下一帧调用release

游戏中,UI节点的释放取决于引用计数,当节点的_referenceCount为0时则销毁自身,析构时把它的所有子节点的parent置为nullptr,_children.clear()把子节点的引用计数-1,同时也会把自身的相关Action清除。

在正常情况下,对于节点移除,我们只关心所需释放的根节点的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值