呈现 SKScene 后取消隐藏 UIButtons 时延迟?

Posted

技术标签:

【中文标题】呈现 SKScene 后取消隐藏 UIButtons 时延迟?【英文标题】:Delay when unhiding UIButtons after presenting SKScene? 【发布时间】:2014-03-20 13:12:51 【问题描述】:

我遇到了一个我没有预料到的延迟/暂停,到目前为止的原因让我摸不着头脑。我有一个简单的游戏设置,其中UIViewController 显示了许多 UIButtons [PLAY GAME] [VIEW SCORES] 等,这反过来又呈现了不同的SKScene

我的问题是,当我尝试从UIViewController 将这些按钮的可见性设置为可见(以前设置为隐藏在viewDidLoad)时,它们需要大约 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 会回调到主线程上,这个假设是正确的还是我错了吗?

EDIT_002:

移到下面回答。

【问题讨论】:

运行在主线程上显示按钮的代码。 我会对此进行调查并回复您,感谢您的指点。 您的 EDIT 是一个很好的观察,如果您找到了解决方案,请告诉我,谢谢 对问题进行了编辑以显示导致问题的原因...,感谢 Akshat 最初的评论让我走上了正轨,非常感谢。 @fuzzygoat 请发布 EDIT_002 作为答案并接受它。 【参考方案1】:

关于 preloadTextureAtlases:withCompletionHandler:completionHandler 在后台线程上调用,我会假设用于预加载图集的同一个。我遇到的问题是我正在使用完成处理程序向我的 viewController 发送一个 NSNotification 说“资产已加载,开始游戏”这个问题是“通知在发送它们的同一线程中传递from" 所以我的游戏也从后台线程开始。因此,将 UIButtons 设置为可见的代码也在同一个后台线程上运行,因此它们对变为可见或隐藏的反应会有延迟。

【讨论】:

以上是关于呈现 SKScene 后取消隐藏 UIButtons 时延迟?的主要内容,如果未能解决你的问题,请参考以下文章

从 SKScene 呈现后无法关闭视图控制器

关闭 SKScene 后,内存仍然很高

SKScene touchesEnded 第二次呈现场景时未调用

如何从 SKScene 呈现 UIAlertController

如何在 SKScene 中呈现 UIViewController?

如何使用社交框架呈现来自 SKscene 的 UIViewController?