
我理解中的cocos2dx之Ref
发布日期:2021-05-14 02:24:22
浏览次数:11
分类:精选文章
本文共 2568 字,大约阅读时间需要 8 分钟。
Cocos2D X内存管理机制详解
Cocos2D X中的内存管理机制非常关键,它通过引用计数和自动回收池(Autorelease Pool)确保程序的高效运行。
引用计数机制
Cocos2D X的内存管理核心是Ref
类,其通过引用计数(reference count)来管理对象的生命周期。
与retain()和release()函数相关的操作
retain()函数
每当一个Ref
对象被retain()
调用时,引用计数 _referenceCount
会增加1。这通常用于延长对象的生命周期,确保它不会被立即释放。void Ref::retain() { CCASSERT(_referenceCount > 0, "reference count should be greater than 0"); ++_referenceCount;}
release()函数
当release()
被调用时,引用计数减少1。当计数变为0时,Ref
会释放自己的内存:void Ref::release() { CCASSERT(_referenceCount > 0, "reference count should be greater than 0"); --_referenceCount; if (_referenceCount == 0) { #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) auto poolManager = PoolManager::getInstance(); if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this)) { CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool."); } #endif #if CC_REF_LEAK_DETECTION untrackRef(this); #endif delete this; }}
自动回收池(Autorelease Pool)
自动回收池通过将对象加入并管理一个内存容器,延迟释放对象直到需要的时候。
Ref* Ref::autorelease() { PoolManager::getInstance()->getCurrentPool()->addObject(this); return this;}
自动回收池的实现
内存池通过以下方式工作:
void AutoreleasePool::addObject(Ref* object) { _managedObjectArray.push_back(object);}
内存池在清理时会释放所有被管理对象:
void AutoreleasePool::clear() { #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) _isClearing = true; #endif for (const auto &obj : _managedObjectArray) { obj->release(); } _managedObjectArray.clear(); #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) _isClearing = false; #endif}
内存管理流程
循环中的内存管理
Cocos2D X运行一个大型循环来处理绘图、事件和其他任务。在循环体内,内存会被定期清理:Application::getInstance()->run();... while (!glview->windowShouldClose()) { QueryPerformanceCounter(&nNow); if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart) { nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart); director->mainLoop(); glview->pollEvents(); } else { Sleep(1); }}
主循环中的清理过程
在DisplayLinkDirector
的mainLoop()
中,内存池会被清理:void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) { _purgeDirectorInNextLoop = false; purgeDirector(); } else if (! _invalid) { drawScene(); PoolManager::getInstance()->getCurrentPool()->clear(); }}
保障内存安全
Cocos2D X的内存管理机制通过严格的引用计数和自动回收池确保内存不会泄漏。开发者无需手动管理对象生命周期,系统会自动处理对象的保留和释放。
要实现高效的内存管理,理解Cocos2D X的引用计数和自动回收池机制至关重要。正确使用这些工具可以帮助开发者避免内存泄漏,并提升应用的稳定性和性能。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月17日 02时40分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
软件架构设计和MESH经验之谈
2019-03-09
redis持久化分析
2019-03-09
复杂指针解析
2019-03-09
打开word时424错误
2019-03-09
如何添加开机自启项
2019-03-09
❤️一个18k运维项目经验这样做的,offer到碗里来❤️
2019-03-09
关于宝塔面板安装的mysql用Navicat连接出现2003的错误解决
2019-03-09
Windows2016 FTP用户隔离
2019-03-09
js传入参数是中文的时候出现 “******”未定义错误
2019-03-09
responded with a status of 404 ()
2019-03-09
吴恩达机器学习课程笔记(英文授课) Lv.1 新手村(回归)
2019-03-09
pair的用法
2019-03-09
SQL基本操作命令
2019-03-09
强制类型转换原理
2019-03-09
伪类选择器
2019-03-09
两正态总体参数的检验
2019-03-09
C# WinForm程序退出的方法
2019-03-09
ubuntu安装gem和fastlane
2019-03-09
onFailure unexpected end of stream
2019-03-09