cocos2d如何预加载资源?

Posted

技术标签:

【中文标题】cocos2d如何预加载资源?【英文标题】:How to preload assets in cocos2d? 【发布时间】:2013-09-04 22:28:44 【问题描述】:

我的游戏在启动时有轻微的“闪烁”,因为我试图在 appDidFinishLoading 中加载大量游戏资源(几个 CCScene 和纹理)。我发现尝试异步加载纹理或 CCScenes 会导致绘图问题(纹理只是一个黑色方块)。在 cocos2d 中初始化游戏资源(不仅仅是纹理)的正确方法是什么?

【问题讨论】:

显示一个带有加载图形的“加载”场景,然后加载剩余的资源(异步与否) 这很奇怪...我做了一个“加载”场景,我在它的 init 方法中加载我的资产,然后在 onEnter 中切换场景,但它仍然跳过... ...等待。在里面。正在加载。废话。等一下! 为什么在 OnEnter 中切换场景而不是一些异步资源加载的回调? 因为 14 小时前我还是个笨程序员。 NSOperation,你这辈子都去哪儿了?! 【参考方案1】:

为了将来阅读本文的任何人的利益,有一件事情可能会让您感到困惑:如果将 [CCTextureCache addImage:filename] 放在异步线程中,它就不起作用。相反,您必须使用 [CCTextureCache addImageAsync:target:selector]。它让我暂时无法找到正确的解决方案:制作一个“正在加载”的 CCScene,它只会在其 init 函数中添加一个与您的启动图像相匹配的背景图像。然后,在 onEnter 中,使用 NSOperationQueue 执行加载。 NSOperationQueue 很好,因为您可以在操作之间分配依赖关系,并根据需要使用完成块(更新进度条等)。这是一篇关于使用它们的有用文章:http://nshipster.com/nsoperation/

示例实现:

-(void)onEnter

    [super onEnter];

    NSOperationQueue *queue = [NSOperationQueue new];

    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadTextures) object:nil];
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadAudio)    object:nil];
    NSInvocationOperation *operation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(displayGame)  object:nil];

    [operation3 addDependency:operation1];
    [operation3 addDependency:operation2];

    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];

最后,需要注意的一件事:当您以这种方式异步加载资源时,您可能会有一些“空白”纹理。确保您在此类操作中初始化的任何场景都将其纹理缓存在上一个操作中。此外,由于某种原因,如果您使用如下方法声明纯色精灵,则必须使用已异步缓存的虚拟纹理(类似于白色 1x1 png),否则将无法正常工作。

+(CCSprite *)createCCSpriteWithColor:(ccColor3B)color andSize:(CGSize)size
   
    CCSprite *sprite = [CCSprite node]; // Does not work asynchronously
    CCSprite *sprite = [CCSprite spriteWithFile:@"blank.png"]; // Works asynchronously, if texture has been cached asynchronously

    [sprite setTextureRect:CGRectMake(0, 0, size.width, size.height)];
    [sprite setColor:color];
    return sprite;

【讨论】:

以上是关于cocos2d如何预加载资源?的主要内容,如果未能解决你的问题,请参考以下文章

web资源预加载-生产环境实践

如何在 Vue-CLI 3 中将预取和预加载资源插入到我的自定义 HTML 文件中?

前端优化 之 图片预加载和懒加载

页面性能优化:preload预加载静态资源

在 Flutter 应用中预加载(所有)图像资源

前端性能优化 – 资源预加载