如何处理来自游戏中心的延迟峰值

时间:2016-04-11 07:07:13

标签: swift sprite-kit game-center

我的游戏使用游戏中心进行记分牌。在应用程序开始时,我要求Game Center登录。

问题是,在游戏中心弹出“欢迎回来......”之后会有不同的时间,这会在我的应用中产生巨大的延迟峰值,这已经是资源已经很少了。

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

我该怎么办呢?我有一个加载屏幕,我可能不会完成加载,直到事情弹出?

这是我现在使用的代码

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()})
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

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

  1. 停用开始游戏按钮,以便用户在无法登录时无法尝试会话。
  2. 开始身份验证
  3. 做所有其他启动内容,动画等。
  4. 在身份验证处理程序中,如果成功,请启用游戏开始按钮
  5. 通过这种方式,我将延迟疼痛移动到应用启动,这可能会被正常的应用启动延迟,启动动画和其他内容所掩盖。当我实际启动游戏会话时,我确保登录开销(或失败)已经完成。

    顺便说一句,与您的问题没有直接关系,但我注意到在您的身份验证处理程序中,如果它存在,则显示视图控制器,并假设如果视图控制器为零,则对用户进行身份验证。请注意,发生错误时,会设置错误值,但视图控制器为零。因此,一个零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()})
            }
        }