我遇到了一个我没有预料到的延迟/暂停,原因到目前为止让我挠头。我有一个简单的游戏设置,其中UIViewController
显示了许多ui按钮[PLAY game] [VIEW SCORES]等,这些按钮依次呈现不同的SKScene
我的问题是,当我尝试将这些按钮的可见性设置为可见(之前设置为隐藏在viewDidLoad
中)时,从UIViewController
他们需要大约5秒才能实际显示。
@implementation ViewController
- (void)presentTitleScene {
// SHOW BUTTONS
[[self logoLabel] setHidden:NO];
[[self gameButton] setHidden:NO];
[[self scoreButton] setHidden:NO];
[[self creditsButton] setHidden:NO];
// PRESENT SCENE
SKScene *titleScene = [TitleScene sceneWithSize:[[self spriteKitView] bounds].size];
[titleScene setName:@"TITLE_SCENE"];
[titleScene setScaleMode:SKSceneScaleModeAspectFill];
[(SKView *)[self view] presentScene:titleScene];
[self setCurrentScene:titleScene];
}
@end
发生了什么是所有的代码运行,SKScene
呈现正确,然后大约5-6秒后按钮出现?我能对此做些什么(强制更新),或者这只是一个设计出来或忍受它的情况?
这在模拟器和设备上都发生。
<标题>编辑:查看输出日志,您可以清楚地看到,在调用preloadTextureAtlases:withCompletionHandler:
之后,执行跳转到另一个线程。方法preloadTextureAtlases:withCompletionHandler:
在主线程上被调用,它应该在后台线程上预加载textureAtlas(s),但我的印象是completionHandler会回调到主线程上,这个假设是正确的还是我错了?
移至下方回答
标题>标题>关于preloadTextureAtlases:withCompletionHandler: completionHandler在后台线程上被调用,我会假设相同的一个用于预加载地图集。我遇到的问题是,我正在使用完成处理程序向我的viewController发送一个NSNotification,说"资产已经加载,开始游戏",这个问题是"通知在它们发送的同一个线程中传递",所以我的游戏也在后台线程中启动。因此,将ui按钮设置为可见的代码也在相同的后台线程上运行,因此它们对可见或隐藏的反应延迟。