如何处理游戏中心的滞后峰值
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
:
- 禁用开始游戏按钮,这样用户即使无法登录也无法尝试会话。
- 开始认证
- 做所有其他启动内容、动画等
- 在验证处理程序中,如果成功,启用开始游戏按钮
通过这种方式,我将延迟问题转移到了应用程序启动上,这可能会被正常的应用程序启动延迟、启动动画等等所掩盖。当我实际启动游戏会话时,我已确保不会出现登录开销(或失败)。
顺便说一句,与您的问题没有直接关系,但我注意到在您的身份验证处理程序中,如果视图控制器存在,您将提供它,如果视图控制器为零,则假定用户已通过身份验证。请注意,当发生错误时,会设置错误值,但视图控制器为 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()})
}
}
我的游戏使用 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
:
- 禁用开始游戏按钮,这样用户即使无法登录也无法尝试会话。
- 开始认证
- 做所有其他启动内容、动画等
- 在验证处理程序中,如果成功,启用开始游戏按钮
通过这种方式,我将延迟问题转移到了应用程序启动上,这可能会被正常的应用程序启动延迟、启动动画等等所掩盖。当我实际启动游戏会话时,我已确保不会出现登录开销(或失败)。
顺便说一句,与您的问题没有直接关系,但我注意到在您的身份验证处理程序中,如果视图控制器存在,您将提供它,如果视图控制器为零,则假定用户已通过身份验证。请注意,当发生错误时,会设置错误值,但视图控制器为 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()})
}
}