Я пытаюсь выяснить, в чем разница между этими двумя примерами и как работает 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
}];
Привет Sangony, спасибо за подсказки! На самом деле я собирался написать ответ на свой вопрос, но неважно. Я все пробовал. В первом примере обработчик завершения preloadTextureAtlases вызывается в фоновом потоке, которого я не ожидал. Из-за этого setupScene вызывается в фоновом режиме. Во втором примере настройка сцены выполняется в основном потоке (dispatch_get_main_queue). Я думал, что нет никакой разницы между этими двумя примерами, но есть. Вот одна аналогичная тема http://stackoverflow.com/questions/22534088/delay-when-unhiding-uibuttons-after-presenting-skscene – Whirlwind
Я предварительно загружаю активы в фоновом режиме из-за загрузки анимации ... Это единственная причина , В противном случае приложение зависнет примерно на 0,5 или 1 секунду, а загрузка анимации прекратится. – Whirlwind
В документах Apple для preloadTextureAtlases явно указано: «SpriteKit создает фоновое задание, которое загружает данные текстуры из всех указанных атласов. Затем SpriteKit возвращает управление вашей игре. После того, как атласы загружены, вызывается обработчик завершения». – MoDJ