在iOS 9上,当关闭一个视图控制器时出现延迟。

4
这是关于我基于Swift的Sprite Kit游戏的内容。在iOS 8上运行良好,但是当我开始在iOS 9设备上运行游戏时,我注意到了这种延迟。在我的游戏从菜单或其他呈现的视图返回到游戏场景之前,点击其中一个视图中的取消按钮会有一到两秒钟的延迟。
我使用以下代码关闭视图:
self.dismissViewControllerAnimated(true, completion: nil)

为了解决这个问题,我尝试将代码运行在主调度队列中,但并没有起到帮助作用。
dispatch_async(dispatch_get_main_queue()) {
     self.dismissViewControllerAnimated(true, completion: nil)
}

检查了游戏视图加载的方法是否有可能导致延迟,但看起来没有问题。至少在iOS 8中,代码没有问题。

有人遇到过类似的问题,然后解决了吗?

编辑:意识到游戏场景已经开始执行,而当我的视图被取消时,我可以看到动画已经在播放了。例如,一个3秒的动画已经完成了一半。

编辑2:这个问题在使用iPhone 4s的iOS 9上不会发生,但在后来的版本(如iPhone 6)中会发生。这可能是由于新的Metal渲染引起的。4s没有Metal。最新的iOS补丁也没有解决这个问题。

编辑3:使用两个SKViews时也会出现同样的滞后。为了消除UIControlView到SKView转换的延迟,我试图用另一个SKScene替换我的UIView、它的控件和UIControlView。即使我将转换时间设置为零秒,当SKView被取消时还是会有延迟。这次滞后发生在两个方向上,所以更糟糕。当前版本iOS 9.2,Xcode 7.2。


我认为我也有这个问题,在我的iPhone 6上发生,但在模拟器上没有。我尝试在主队列上运行它,并尝试完全删除我的SpriteKit场景(只留下SKView),但仍然会发生。你找到解决方案了吗?这个问题是否相关?http://stackoverflow.com/questions/23437568/lag-delay-on-modalviewcontroller-dismiss-after-loading-an-xib-view-over-skview - kamatsu
是的,我也遇到了同样的问题。这在模拟器上不会发生,但在我的iPhone 6和5s上会发生。这两个手机在iOS9中都有SpriteKit的金属渲染。在iOS9上的4s上不会发生这种情况。我看过你之前发布的链接,但那与我的情况无关。我尝试了几个示例项目来测试它。我做的另一个测试是尝试在两个SKView之间进行转换,而不是从UIViewController到SKView。在这种情况下,两个SKView之间仍然存在延迟,即使您将过渡时间设置为零秒。所以我仍然没有解决方案。 - Ali Hus
2个回答

12

可能有些晚了,但也许能帮到其他人。我遇到了类似的问题(在使用SpriteKit的游戏中,在由带有SKView的ViewController呈现的MenuViewController上解除显示时会出现延迟),以下是解决方法:

当你呈现全屏的ViewController(包含菜单、设置等)时,将modalPresentationStyle设置为.OverFullScreen

这里是一些简要信息,来自Apple iOS视图控制器编程指南:

当使用UIModalPresentationFullScreen样式呈现视图控制器时,UIKit通常会在过渡动画完成后删除底层视图控制器的视图。您可以通过指定UIModalPresentationOverFullScreen样式来防止删除那些视图。当呈现的视图控制器具有透明区域,可以让底层内容显示时,您可能会使用该样式。

我认为这种延迟与恢复基础视图的过程有关,这在带有呈现场景的SKView情况下可能比较复杂。


1
非常感谢,这让我抓狂了! - Torre Lasley
已经有一段时间了,但现在才注意到。我将在本周测试这个解决方案,如果有效的话就选它作为答案。谢谢。 - Ali Hus
太棒了,经过漫长的时间终于找到了正确的解决方案。非常感谢您 :) - Jovan Jovanovski

0

好的,我也遇到了同样的问题。

我的项目是用早期版本的Xcode创建的。我创建了一个新的ViewController并调用了pushViewController()方法。这导致了2-3秒的延迟。

我删除了这个ViewController并创建了一个新的。新的ViewController在Interface Builder中具有相同的名称和类。

延迟消失了。它可以正常工作。虽然很神奇,但确实有效。


很遗憾,这个方法没有起作用。我已经创建了一个全新的测试视图控制器,但是结果仍然一样,在关闭它时会有延迟。这个测试控制器并没有做任何事情,只是具备返回功能。谢谢。 - Ali Hus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接