1

Я пытаюсь выяснить, в чем разница между этими двумя примерами и как работает preloadTextureAtlases: withCompletionHandler. Вот код:Как работает SKTextureAtlas 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 

}]; 

ответ

2

Вы можете предварительно загрузить в фоновом режиме, но возникает вопрос, почему бы вы? Скорее всего, ваша игра не может начать играть до тех пор, пока не будут загружены все необходимые активы, поэтому пользователю придется ждать независимо.

Вы можете предварительно загрузить все необходимые вам ресурсы, чтобы начать игру и загрузить дополнительные ресурсы, которые могут потребоваться во время более поздней игры. Такие обстоятельства действительно необходимы только в очень сложных играх, а не на платформе iOS.

Что касается вашего вопроса о загрузке в фоновом режиме во время игры, то нет определенного ответа. Все зависит от того, насколько велика нагрузка, загрузка вашего процессора и т. Д. Попробуйте и посмотрите, что происходит, потому что кажется, что вы задаете вопросы по вопросам, которые вы не пробовали в первую очередь.

Если вы действительно намерены фоновых задач, помните, что вы можете добавить блок завершения ваших пользовательских методов, как это:

-(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(); 
      } 
     }); 
    }); 
} 
+0

Привет Sangony, спасибо за подсказки! На самом деле я собирался написать ответ на свой вопрос, но неважно. Я все пробовал. В первом примере обработчик завершения preloadTextureAtlases вызывается в фоновом потоке, которого я не ожидал. Из-за этого setupScene вызывается в фоновом режиме. Во втором примере настройка сцены выполняется в основном потоке (dispatch_get_main_queue). Я думал, что нет никакой разницы между этими двумя примерами, но есть. Вот одна аналогичная тема http://stackoverflow.com/questions/22534088/delay-when-unhiding-uibuttons-after-presenting-skscene – Whirlwind

+0

Я предварительно загружаю активы в фоновом режиме из-за загрузки анимации ... Это единственная причина , В противном случае приложение зависнет примерно на 0,5 или 1 секунду, а загрузка анимации прекратится. – Whirlwind

+0

В документах Apple для preloadTextureAtlases явно указано: «SpriteKit создает фоновое задание, которое загружает данные текстуры из всех указанных атласов. Затем SpriteKit возвращает управление вашей игре. После того, как атласы загружены, вызывается обработчик завершения». – MoDJ