如何处理SpriteKit中的场景加载延迟

时间:2014-06-02 07:15:11

标签: ios7 sprite-kit

我正在为播放器加载选择场景,但是,当我点击移动到该场景的按钮时,它需要4-5秒才能显示新场景。

在主菜单中我使用:

SKTransition *transition = [SKTransition fadeWithDuration:0.1];

SKScene * scene = [[SelectionScene alloc] initWithSize:self.size];

[self.view presentScene:scene transition:transition];

在SelectionScene中我使用:

- (id) initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size]) {                

        [self setupScene];
        [self setupSelection];

    }

    return self;
}

如上所述,点击按钮之间需要4-5秒,直到它移动到下一个场景。有没有办法稍后设置场景,所以它首先显示下一个场景(我将显示一个加载屏幕)并在后台加载?

我尝试过使用:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){

    //Background Thread
    dispatch_async(dispatch_get_main_queue(), ^(void){


    });
});

但它不起作用。

2 个答案:

答案 0 :(得分:2)

为避免延迟,最佳做法是在游戏开始前或选择关卡之后使用loadSceneAssetsWithCompletionHandler函数首先加载所有屏幕资源。

参考: Adventure Loads Assets Asynchronously

答案 1 :(得分:0)

对于最简单的选项,我建议在当前SKScene上加载一个活动指示器(向属性发送startAnimating消息),在调度中加载场景,然后在最后一个调度内,向活动指示器发送一条消息停止动画。

在当前SKScene对象的界面中包含此属性:

@property(strong, nonatomic) UIActivityIndicatorView *activityIndicator;

然后无论你在哪里加载场景(即touchesEnded事件),都要使用以下内容:

[self.activityIndicator startAnimating];

dispatch_async(dispatch_get_main_queue(), ^{

    PVZLevelScene *levelScene =
    [[PVZLevelScene alloc] initWithSize:self.size level:theSelectedLevel];

    [self.view presentScene:levelScene
             transition:[SKTransition flipHorizontalWithDuration:0.5]];

    [self.activityIndicator stopAnimating];

});