我试图弄清楚这两个示例之间的区别以及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/