如何处理游戏中心的滞后峰值

How to deal with lag spike from gamecenter

我的游戏使用 Game Center 作为计分板。在应用程序开始时,我要求 Game Center 登录。

问题是,在一段可变的时间后,Game Center 会弹出它的 "welcome back...." 东西,这在我的应用程序中造成了巨大的延迟峰值,资源已经很低了。

我玩过完成处理程序,试图在横幅完成时找出某种回调...但什么也没有!

我该如何处理?我有一个加载屏幕,我是否可以在它弹出之前完成加载?

这是我现在使用的代码

func authenticateLocalPlayer()
    {
        Holder.loggedIn = false
        print("Start Authenticate")
        let localPlayer = GKLocalPlayer.localPlayer()
        localPlayer.authenticateHandler = {(viewController, error) -> Void in
            if (viewController != nil)
            {
                self.presentViewController(viewController!, animated: false, completion: {self.authenticated()})
            }
        }
    }

我见过同样的事情,甚至看到同一网络上彼此相邻的不同设备的登录时间不同。我认为我的策略最初来自 Apple 的文档或 WWDC 视频,但我没有方便的参考,是在启动时立即启动身份验证,就像我的第一个视图控制器 viewDidAppear:

  1. 禁用开始游戏按钮,这样用户即使无法登录也无法尝试会话。
  2. 开始认证
  3. 做所有其他启动内容、动画等
  4. 在验证处理程序中,如果成功,启用开始游戏按钮

通过这种方式,我将延迟问题转移到了应用程序启动上,这可能会被正常的应用程序启动延迟、启动动画等等所掩盖。当我实际启动游戏会话时,我已确保不会出现登录开销(或失败)。

顺便说一句,与您的问题没有直接关系,但我注意到在您的身份验证处理程序中,如果视图控制器存在,您将提供它,如果视图控制器为零,则假定用户已通过身份验证。请注意,当发生错误时,会设置错误值,但视图控制器为 nil。因此,nil VC 可能意味着用户已通过身份验证,但也可能意味着身份验证失败。始终首先检查 error 的值。

    localPlayer.authenticateHandler = {(viewController, error) -> Void in
        if (error)
        {
              //check and process the error.

              //bail out because we are NOT authenticated
              return;
        }

        if (viewController != nil)
        {
            self.presentViewController(viewController!, animated: false, completion: {self.authenticated()})
        }
    }