在cocos2d中显示加载图形,不会滞后或断断续续

时间:2013-12-30 17:12:01

标签: ios iphone cocos2d-iphone

在某些情况下,我希望在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的CCSprite方法中创建init个对象,通过[[CCTextureCache sharedTextureCache] addImage:fnTexture];缓存纹理等。

不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着我创建一些漂亮动画(例如旋转图形)的任何尝试在线程工作时基本上都会锁定,而且我的漂亮动画会冻结。

我可以想到三种可能的解决方案......

  1. 在昂贵的操作之间插入人为延迟,让我的动画时间更新。不幸的是,这仍然会导致抖动的动画,并且肯定会出现“代码味道”。
  2. 以某种方式为动画创建第二个cocos2d渲染线程,短暂的生活......?如果可能的话,我找不到任何文件。
  3. 使用普通的UIView粘贴覆盖我的OpenGL视图,当然在主线程上运行,因此不受这些限制...但是,这需要弄清楚如何将我的相当动画编码为UIKit
  4. #2可能吗?或者......有更好的方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

在git上查看MBProgressHUD。我做了一个快速测试(花了3分钟把它放在我的游戏中):

    MBProgressHUD *hud = [[[MBProgressHUD alloc] init] autorelease];

    hud.xOffset = kScreenWidth / 2;
    hud.yOffset = kScreenHeight / 2;
    hud.progress = .5;
    [hud show:YES];
    [hud setTaskInProgress:YES];
    hud.labelText = @"Loading";

    [[CCDirector sharedDirector].view addSubview:hud];

给我这个:

enter image description here

通过一些非常强烈的纹理预加载和场景设置/计算,它具有极佳的动画效果。您可以在应用程序中找出“如何集成”...... API很好(委托等等)

答案 1 :(得分:0)

不幸的是,解决方案#3不起作用,因为iPhone上的cocos2d实际上使用了cocos2d线程的主线程(但是,这个解决方案适用于OSX,因为它为cocos2d使用了一个单独的线程)。

我的最终解决方案是基于@ LearnCocos2D(上图)的回复。 首先,使用addImageAsync:消除了大部分主线程锁定。剩余的延迟与创建CCNode个对象(例如CCSprite s)有关。我在解决方案#1中使用了一个变体来在我的loader类中创建预先构建的cocos对象的缓存,然后可以在以后重用它(例如,在渲染层时)以防止需要在运行时分配对象。