Cocos2d-lua 内存管理
2017-08-29 17:08
435 查看
前言
Cocos2d-x的核心框架是由C++来实现的,然后通过LuaBinding转化为Lua API。
内存管理
如下Lua代码:
内部调用了C++代码:
Cocos2d-x 对 sprite 的生命周期管理,并不符合一般的C++变量。而是使用一套叫做【基于引用计数的自动回收机制】。
1、引用计数(Reference Count)
Cocos2d引擎中抽象了一个基类Ref,需要引用计数管理的类都会继承自该类,Ref提供了一个计数器,当新建一个Ref实例时,计数器初始化为1。同时Ref提供了修改计数器的接口:
Ref::retain(),计数器加一。
Ref::release(),计数器减一。
Ref::autorelease(),将实例添加到AutoReleasePool,在游戏的下一帧时调用release()方法。
Ref::getReferenceCount(),返回当前计数器值。
2、自动回收池(AutoReleasePool)
所有通过create方法生成的对象,都会自动添加到默认的自动回收池中。如Node的create方法如下:
被加入到自动回收池中的对象,计数器在游戏的下一帧调用release()方法,使计数器减一。而如果当上面创建的sprite没有被添加入scene中,那么就会因为计数器被减为0而销毁,所以实际上,调用addChild()方法会调用sprite::retain()方法,以保证对象不会被销毁。
总结:
Cocos2d-x引擎中的对象被创建后,使用retain和release来管理对象的生命周期,结合AutoreleasePool的使用,达到了对象生命周期自动管理的目的。
一个Lua对象的销毁,其实是AutoreleasePool先把该C++对象释放,然后C++对象的析构函数再通知Lua解析器,将Lua对象内部的cobj释放。
Ps:
在上述代码中,引擎会报错:invalid ‘cobj’ in function ‘lua_cocos2dx_Node_xxxxx’
尽管在Lua中sprite变量仍然存在,但是C++层已经被销毁。
Cocos2d-x的核心框架是由C++来实现的,然后通过LuaBinding转化为Lua API。
内存管理
如下Lua代码:
local luaScene = cc.Scene:create() local luaSprite = cc.Sprite:create("hi.png") luaScene:addChild(luaSprite)
内部调用了C++代码:
auto cppScene = cocos2d::Scene::create(); auto cppSprite = cocos2d::Sprite::create("hi.png"); cppScene::addChild(cppSprite);
Cocos2d-x 对 sprite 的生命周期管理,并不符合一般的C++变量。而是使用一套叫做【基于引用计数的自动回收机制】。
1、引用计数(Reference Count)
Cocos2d引擎中抽象了一个基类Ref,需要引用计数管理的类都会继承自该类,Ref提供了一个计数器,当新建一个Ref实例时,计数器初始化为1。同时Ref提供了修改计数器的接口:
Ref::retain(),计数器加一。
Ref::release(),计数器减一。
Ref::autorelease(),将实例添加到AutoReleasePool,在游戏的下一帧时调用release()方法。
Ref::getReferenceCount(),返回当前计数器值。
2、自动回收池(AutoReleasePool)
所有通过create方法生成的对象,都会自动添加到默认的自动回收池中。如Node的create方法如下:
Node *Node::create() { Node *ret = new Node(); if(ret && ret->init()) { ret->autorelease(); } else { CC_SAFE_DELETE(ret); } return ret; }
被加入到自动回收池中的对象,计数器在游戏的下一帧调用release()方法,使计数器减一。而如果当上面创建的sprite没有被添加入scene中,那么就会因为计数器被减为0而销毁,所以实际上,调用addChild()方法会调用sprite::retain()方法,以保证对象不会被销毁。
总结:
Cocos2d-x引擎中的对象被创建后,使用retain和release来管理对象的生命周期,结合AutoreleasePool的使用,达到了对象生命周期自动管理的目的。
一个Lua对象的销毁,其实是AutoreleasePool先把该C++对象释放,然后C++对象的析构函数再通知Lua解析器,将Lua对象内部的cobj释放。
Ps:
sprite = display.newSprite("hi.png") -- 延迟执行 self:preformwithDelas(function() sprite:addTo(self) end, 1.0)
在上述代码中,引擎会报错:invalid ‘cobj’ in function ‘lua_cocos2dx_Node_xxxxx’
尽管在Lua中sprite变量仍然存在,但是C++层已经被销毁。
相关文章推荐
- Cocos2d-x内存管理研究
- Cocos2d-Lua之if分支语句
- Cocos2d-x之LUA脚本引擎深入分析
- Cocos2d-Lua之table的排序
- Cocos2d-Lua之math库
- (原创)cocos2d-x 3.0+ lua 学习和工作(2) : 单一继承简单介绍
- Cocos2d-x手动绑定C++类到Lua
- [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件
- Cocos2d-x3.0下 Lua与C++相互调用
- cocos2d-x lua 和c++的相互调用的原理
- Cocos2d-x 脚本语言Lua介绍
- Cocos2d-x-Lua 游戏中使用Lua脚本进行游戏开发
- Cocos2d-x-lua实现简单的动画帧、读取CocoStudio文件
- cocos2d-x lua 学习笔记(1) -- 环境结构
- [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件
- Cocos2d-lua环境搭配
- Cocos2d-x 脚本语言Lua基本数据结构-表(table)
- cocos2d-x-lua基础系列教程一(hello lua)
- Cocos2d-x 内存管理浅说
- Cocos2d-x内存管理(二)