- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Cocos2d-x教程内存管理支持多线程
Cocos2d-x教程内存管理支持多线程
最近使用Cocos2d-x开发游戏,发现Cocos2d-x的内存管理采用Objective-C的机制,大喜过望。因为只要坚持Objective-C的原则“谁创建谁释放,谁备份谁释放”的原则即可确保内存使用不易出现Bug。
但是因为本身开放的游戏需要使用到多线程技术,导致测试的时候总是莫名其妙的导致空指针错误。而且是随机出现,纠结了2天无果后,开始怀疑Cocos2d-X的内存本身管理可能存在问题。怀着这样的想法,一步一步的调试,发现经常出现指针异常的变量总是在调用autorelease后一会就莫名其妙再使用的时候就抛异常。狠下心,在它的析构函数里面断点+Log输出信息。发现对象被释放了。一时也很迷糊,因为对象只是autorelease,并没有真正释放,是谁导致它释放的?
然后就去看了CCAutoreleasePool的源码,发现存在Cocos2d-X的内存管理在多线程的情况下存在如下问题
如图:thread 1和thread 2是独立的两个线程,它们之间存在CPU分配的交叉集,我们在time 1的时候push一个autorelease的自动释放池,在该线程的末尾,即time 3的时候pop它。同理在thread 2的线程里面,在time 2的时候push一个自动释放池,在time 4的时候释放它,即Pop.
此时我们假设在thread 2分配得到CPU的时候有一个对象obj自动释放,即obj-autorelease().那么在time 3的时候会发生是么事情呢?
答案很简单,就是obj在time 3的时候就被释放了,而我们期望它在time 4的时候才释放。所以就导致我上面说的,在多线程下面,cocos2d-x的autorelease变量会发生莫名其妙的指针异常。
解决办法:在PoolManager给每个线程根据pthread_t的线程id生成一个CCArray的stack的嵌套管理自动释放池。
所以我在Push的时候根据当前线程的pthread_t的线程id生成一个CCArray的stack来存储该线程对应的Autoreleasepool的嵌套对象
源码如下
class CC_DLL CCPoolManager{/////【diff - begin】- by layne////////CCArray* m_pReleasePoolStack; //CCAutoreleasePool* m_pCurReleasePool;// CCAutoreleasePool* getCurReleasePool();CCDictionary* m_pReleasePoolMultiStack;pthread_mutex_t m_mutex; // for multi-thread lockCCArray* getCurReleasePoolStack();CCAutoreleasePool* getCurReleasePool(bool autoCreate = false);/////【diff - end】- by layne//////
public:
CCPoolManager();
~CCPoolManager();
void finalize();
void push();
void pop();
void removeObject(CCObject* pObject);
void addObject(CCObject* pObject);
static CCPoolManager* sharedPoolManager();
static void purgePoolManager();
friend class CCAutoreleasePool;
};
//-------------------------------------------------------------------//// CCPoolManager////--------------------------------------------------------------------
/////【diff - begin】- by layne//////
CCPoolManager* CCPoolManager::sharedPoolManager()
{
if (s_pPoolManager == NULL)
{
s_pPoolManager = new CCPoolManager();
}
return s_pPoolManager;
}
void CCPoolManager::purgePoolManager()
{
CC_SAFE_DELETE(s_pPoolMana
您可能关注的文档
- 9-销售台账管理制度.doc
- 单元质量评估(二)答案.ppt
- 单元评估质量检测(七).ppt
- 914公式法教案.doc
- 910基础评估报告.doc
- 916分组分解法教案.doc
- 92物质的提纯和分离.doc
- 单元质量评估(十四).ppt
- 单元质量评估四曲线运动万有引力与航天.doc
- 单动拉延模具工序流程.ppt
- 2022级浙江高三数学8月学业素养测试卷(含答案).pdf
- 2022年5月21日全国事业单位联考《综合应用能力》C类笔试题.pdf
- 2021-2022年山西吕梁孝义高一开学考试数学试卷.pdf
- 2021-2022年辽宁大连市高一期末考试数学试题(有答案).pdf
- 2021-2022年吉林白山高一期末数学试题(含答案).pdf
- 2022年7月陈身杯数学竞赛试题卷(含答案).pdf
- 2021-2022年江苏淮安市高一期末考试数学试题(有答案).pdf
- 2021-2022年江西景德镇期末考试考数学试题(有答案).pdf
- 2022年贵州公务员考试《行测》笔试题.pdf
- 2022年5月23日上午山东考青岛市面试题.pdf
文档评论(0)