1

これら 2 つの例の違いと、 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

}];
4

1 に答える 1

2

バックグラウンドでプリロードすることはできますが、問題はその理由です。必要なアセットがすべて読み込まれるまでゲームのプレイを開始できない可能性があるため、ユーザーはとにかく待たなければなりません。

ゲームを開始するために必要なアセットをプリロードし、後のゲーム プレイ中に必要になる追加アセットをバックグラウンドでロードできます。このような状況は、非常に複雑なゲームでのみ必要であり、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();
            }
        });
    });
}
于 2015-03-31T13:28:44.783 に答える