Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在cocos2d-x中的单独线程中加载纹理?_Multithreading_Cocos2d X - Fatal编程技术网

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

Multithreading 如何在cocos2d-x中的单独线程中加载纹理?,multithreading,cocos2d-x,Multithreading,Cocos2d X,为了减少内存占用,我需要使用多线程动态加载额外的纹理 例如,我有10种类型的敌人可以在一个关卡中使用,但是敌人会一种一种地出现。“一种类型一种类型”的上下文意味着一种类型的敌人出现,玩家杀死了它的所有实例,然后是时候调用另一种类型了。这个过程是这样的,直到所有类型都出来,然后级别就完成了 您可以看到,最好不要在开始时一次加载所有敌人的纹理(它非常大2048*2048,有很多动画帧,我需要在创建时为每种类型的敌人创建它们)。当我需要的时候,我把它变成多线程来加载一个额外的纹理。但是我知道cocos

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

例如,我有10种类型的敌人可以在一个关卡中使用,但是敌人会一种一种地出现。“一种类型一种类型”的上下文意味着一种类型的敌人出现,玩家杀死了它的所有实例,然后是时候调用另一种类型了。这个过程是这样的,直到所有类型都出来,然后级别就完成了

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

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


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

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

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

请注意,
CCSpriteFrameCache
使用
CCTextureCache
加载帧。这也适用于我的案例,加载由动画创建中使用的帧组成的精灵表。但不幸的是,没有为
CCSpriteFrameCache
类提供异步类型的方法。您必须通过
CCTextureCache
手动加载纹理对象,然后将其插入

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

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

  • Texture2dTest.cpp
  • TextureCacheTest.cpp