我试图弄清楚这两个示例之间的区别以及preloadTextureAtlases:withCompletionHandler的工作原理。这是代码:

//GameScene.m
-(void)didMoveToView:(SKView *)view {

   //First I create an animation, just a node moving from one place to another and backward.

   //Then I try to preload  two big atlases



[SKTextureAtlas preloadTextureAtlases:@[self.atlasA, self.atlasB] withCompletionHandler:^{
               [self setupScene:self.view];
       }];

我想preloadTextureAtlases会在后台线程上加载,因为我的动画很流畅?

但是从后台线程调用preloadTextureAtlases是否有任何区别(或者可能会出现问题)?像这样:
//GameScene.m
    - (void)loadSceneAssetsWithCompletionHandler:(CompletitionHandler)handler {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
      [SKTextureAtlas preloadTextureAtlases:@[self.atlasA, self.atlasB] withCompletionHandler:^{

                dispatch_async(dispatch_get_main_queue(), ^{

                  [self setupScene:self.view];
                });
            }];

            if (!handler){return;}
            dispatch_async(dispatch_get_main_queue(), ^{
                handler();
            });
        });
    }

然后从didMoveToView调用此方法:
    [self loadSceneAssetsWithCompletionHandler:^{

    NSLog(@"Scene loaded");
    // Remove loading animation and stuff

}];

最佳答案

您可以在后台预加载,但问题是为什么要这么做?可能是您的游戏只有在加载了所有必需的资源后才能开始播放,因此用户无论如何都必须等待。

您可以预加载开始游戏所需的任何资产,并在以后的游戏过程中后台加载您可能需要的任何其他资产。实际上,仅在非常复杂的游戏中才需要这种情况,而在iOS平台上则不需要。

至于您在游戏进行过程中在后台加载的问题,没有确切的答案。这完全取决于负载的大小,CPU的负载等。尝试一下,看看会发生什么,因为听起来您是在询问尚未首先尝试的问题。

如果您确实有意执行后台任务,请记住,您可以像这样向您的自定义方法添加一个完成块:

-(void)didMoveToView:(SKView *)view {
    NSLog(@"start");

    [self yourMethodWithCompletionHandler:^{
        NSLog(@"task done");
    }];

    NSLog(@"end");
}

-(void)yourMethodWithCompletionHandler:(void (^)(void))done; {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // a task running another thread
        for (int i=0; i<100; i++) {
            NSLog(@"working");
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            if (done) {
                done();
            }
        });
    });
}

关于ios - SKTextureAtlas preloadTextureAtlases:withCompletionHandler如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29358003/

10-13 08:39