【问题标题】:How can I load a texture in separate thread in cocos2d-x?如何在 cocos2d-x 的单独线程中加载纹理?
【发布时间】:2012-10-26 06:41:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: multithreading cocos2d-x


    【解决方案1】:

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

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

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

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

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

    • Texture2dTest.cpp
    • TextureCacheTest.cpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-21
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多