2012-11-06 36 views
2

我需要使用多线程来实时加载额外的纹理以减少内存占用。如何在cocos2d-x的单独线程中加载纹理?

这个例子的例子是,我有10种类型的敌人在一个单一的水平使用,但敌人会按类型出来。 “按类型分类”的上下文意味着一种类型的敌人出现并且玩家杀死它的所有实例,那么是时候以另一种类型进行调用了。这个过程是这样的,直到所有类型出来,然后关卡完成。

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

那么如何在cocos2d-x中单独的线程中加载一个贴图,遵循上面的目标?任何想法,以避免线程安全的问题,但仍然可以实现我的目标,也表示赞赏。

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

回答

3

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

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

请注意,CCSpriteFrameCache使用CCTextureCache加载帧。所以这也适用于我的情况,以加载包含要在动画创建中使用的帧的spritesheet。但不幸的是,CCSpriteFrameCache类没有提供异步类型的方法。你必须通过CCTextureCache手动加载纹理对象,然后将其插入

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

有2档测试项目,你可以看看。

  • Texture2dTest.cpp
  • TextureCacheTest.cpp