如何在cocos2d-x中的单独线程中加载纹理?

时间:2012-11-06 10:17:22

标签: multithreading cocos2d-x

我需要使用多线程来动态加载额外的纹理,以减少内存占用。

示例是我在单个级别中使用10种类型的敌人,但敌人将按类型逐出。 “按类型分类”的上下文意味着一种类型的敌人出现并且玩家杀死其所有实例,然后是时候以另一种类型进行调用。这个过程就是这样,直到所有类型出现,然后水平完成。

你可以看到最好不要在开始的时候一次性加载所有敌人的纹理(它是相当大的2048 * 2048,其中有很多动画帧,我需要在创建时为每种类型的敌人创建它们) 。我把它变成多线程,以便在需要时加载额外的纹理。但我知道cocos2d-x 不是线程安全的。我计划使用CCSpriteFrameCache类从.plist + .png文件加载纹理,然后在那里重新创建动画,最后从中创建一个CCSprite来表示一种新类型的敌人实例。如果我不使用多线程,我可能会遇到加载大量纹理时出现延迟的延迟。

那么如何按照上面的目标在cocos2d-x中的单独线程中加载纹理?任何想法,以避免线程安全问题,但仍然可以实现我的目标也是赞赏。

注意:我正在iOS平台上开发。

1 个答案:

答案 0 :(得分:3)

我发现图像的异步加载已经存在于cocos2d-x中。 您可以构建cocos2d-x的测试项目并查看“Texture2DTest”,然后点击左箭头以查看异步加载的外观。

我已经看了一下代码。 您可以使用addImageAsync CCtextureCache方法在运行时加载其他纹理而不会干扰或减慢其他部分,例如正在运行的当前动画。 实际上,addImageAsync CCTextureCache将为您加载CCTexture2D对象并返回其回调方法以进行接收。您还有其他任务可以代表您使用它。

请注意CCSpriteFrameCache使用CCTextureCache加载框架。因此,这适用于我的情况,以加载由动画创建中使用的帧组成的spritesheet。但遗憾的是,CCSpriteFrameCache类没有提供异步类型的方法。您必须通过CCTextureCache手动加载纹理对象,然后将其插入

void CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)

测试项目中有2个文件可供您查看。

  • Texture2dTest.cpp
  • TextureCacheTest.cpp