1

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

示例案例是我在一个关卡中有 10 种敌人要使用,但敌人会逐个出现。“type by type”的上下文意味着一种类型的敌人出现并且玩家杀死了它的所有实例,然后是时候调用另一种类型了。过程是这样进行的,直到所有类型都出来,然后关卡完成。

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

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

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

4

1 回答 1

3

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

我已经查看了代码内部。您可以使用addImageAsync的方法CCtextureCache动态加载附加纹理,而不会干扰或减慢其他部分,例如正在运行的当前动画。事实上,addImageAsyncofCCTextureCache会为你加载CCTexture2D对象并返回给它的回调方法来接收。您还有其他任务可以代表您使用它。

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

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

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

  • Texture2dTest.cpp
  • TextureCacheTest.cpp
于 2012-11-06T11:05:50.607 回答