【问题标题】:Loading AtlasSpriteManager in background threads are not working在后台线程中加载 AtlasSpriteManager 不起作用
【发布时间】:2009-10-28 12:30:07
【问题描述】:

我正在使用 cocos2d 做一个 iPhone 游戏,其中涉及大量角色动画(至少 25 个不同的动画)。我有很多 spritesheets,每个大小在 100KB 到 200KB 之间。我曾经创建AtlasSpriteManagers 用于这些按需。但是当我在设备中测试这个时,这些动画出现了很多性能问题..缺少帧..游戏挂起,而图像加载等等..

所以我决定创建一种预加载和缓存技术,在该技术中我不断向前看并创建我可能需要的可能 AtlasSpriteManagers 并将它们维护在 NSMutableDictionary 中,并在动画期间从那里获取它......并基于 usageCount变量,稍后我会将它们从字典中删除并释放内存。我使用 performSelectorInBackground 方法调用此函数“loadASM”,该函数创建 AtlasSpriteManager 并将其存储在字典中。

[self performSelectorInBackground:@selector(loadASM:) withObject:fileName];

-(ASMHolder *)loadASM:(NSString *)fileName
{
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40];
ASMHolder *asmHolder = [[ASMHolder alloc] init];
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++;
[asmDict setObject:asmHolder forKey:fileName];

return asmHolder;
}

但是,如果我使用 performSelectorInBackground 在后台调用此方法,图像似乎不会加载。图像应该出现的位置会出现一个白色框。但是,AtlasSpriteManager 对象已创建并且它在字典中..但它只是变成空白精灵..而不是后台调用,如果我尝试直接调用方法'loadASM'(即[self loadASM:fileName]),图像正在加载..但当然,有延迟,因为这是同步调用..

我什至尝试缓存 Texture2D 对象而不是 AtlasSpriteManagers,但结果是一样的..

(我也尝试过 TextureManager 的 addImageAsync .. 但这对我的目的也没有帮助.. 因为它没有在回调方法的参数中给出它正在加载的文件名,没有它我的字典缓存的键无法创建.. )

请帮忙..

谢谢 桑卡尔

【问题讨论】:

    标签: iphone caching cocos2d-iphone


    【解决方案1】:

    您需要做一些特殊的事情才能从多个线程中使用 OpenGL。见this question

    【讨论】:

    • 感谢您的帮助,大卫。我是 OpenGL 新手.. 所以知道如何在 cocos2d 中做到这一点.. 我认为 AtlasSpriteManager 在内部使用 OpenGL.. 但是我可以编写会影响 AtlasSpriteManager 的 OpenGL 代码吗?
    • 您可能需要执行他们在链接文章中谈到的魔法,以告诉您的新线程使用匹配的 OpenGL 上下文。我建议搜索 cocos2d 和 EAGLShareGroup,看看你是否能找到已经这样做的人......另外,你可能需要管理自己的线程,而不仅仅是使用 performSelectorInBackground。
    • 谢谢大卫。。我确实搜索过这个,发现 addImageAsync 函数已经在内部做了这些事情。所以我改变了我的代码以某种方式使用该函数本身。无论如何,谢谢.. :)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2020-03-10
    • 2016-12-28
    • 2023-03-09
    • 2021-09-26
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多