第一次安装时使用Firebase持久数据库
我目前在Unity中开发的应用程序使用启用了数据库持久性的Firebase实时数据库。这对于离线使用应用程序(例如在没有信号的区域)非常有效 但是,如果新用户第一次在没有internet连接的情况下运行应用程序,应用程序将冻结。我猜,这是因为它需要第一次拉下数据库,以便持久性工作 我知道诸如“”之类的线程讨论如何处理与Firebase的数据库断开连接第一次安装时使用Firebase持久数据库,firebase,unity3d,firebase-realtime-database,Firebase,Unity3d,Firebase Realtime Database,我目前在Unity中开发的应用程序使用启用了数据库持久性的Firebase实时数据库。这对于离线使用应用程序(例如在没有信号的区域)非常有效 但是,如果新用户第一次在没有internet连接的情况下运行应用程序,应用程序将冻结。我猜,这是因为它需要第一次拉下数据库,以便持久性工作 我知道诸如“”之类的线程讨论如何处理与Firebase的数据库断开连接 但是,我是否可以检查用户是否是第一次使用该应用程序(例如,通过持久数据库的存在?)。然后我可以通知他们必须联机进行“首次设置”?Firebase数
但是,我是否可以检查用户是否是第一次使用该应用程序(例如,通过持久数据库的存在?)。然后我可以通知他们必须联机进行“首次设置”?Firebase数据库API中没有任何内容可检测其脱机缓存是否已填充 但是,您可以检测何时连接到数据库,例如通过。然后,当第一个设置为
true
时,您可以在本地存储中设置本地标志,例如在PlayerPrefs
中
使用此代码,您可以检测是否在
PlayerPrefs
中设置了该标志,如果未设置,则向用户显示一条消息,说明他们需要网络连接才能下载初始数据。除了@frank van puffelen的回答,我不相信Firebase RTDB本身会导致您的游戏锁定,直到出现网络连接。如果您的游戏在首次启动时可以在没有网络连接的情况下玩(即:您的逻辑本身不需要网络的某些初始状态),您可能需要检查以下问题:
确保您可以处理null
。如果您的游戏逻辑处于协同程序中
,Unity可能会决定以静默方式停止它,而不是完全失败
如果您通过与数据库交互,通常假定它将运行两次(一次针对本地缓存,然后在缓存与服务器同步时再次运行,如果值不同)。这意味着,第一次通过事务执行更改时,您可能会有一个null
previous状态
如果可以的话,你更愿意听一遍。您将始终在Unity主线程上获得此回调,在使用本地缓存中的数据注册后,您将始终获得回调,并且随着服务器的更新,数据将定期更新。此外,如果您看到@frank van puffelen,如果您使用的是GetValueAsync
,则可能无法获得预期的数据(如果用户处于脱机状态,则包括空值)。如果您的游戏被冻结,因为它正在等待一个ContinueWithOnMainThread
(除非您有理由不这样做,否则始终希望此操作优于continueWithUnity
)或wait
语句,这可能ValueChanged
也可以解决此问题(我认为不应该是这种情况)
仔细检查对象的生命周期。应用程序可能会冻结的原因有很多,但在处理异步逻辑时,一定要注意Unity的GameObject生命周期与C#的典型对象生命周期(以及我自己的生命周期)之间的区别。如果在调用await
、ContinueWith[OnMainThread]
或ValueChanged
之前调用了对象OnDestroy
,则您自己的代码中可能会遇到空引用。如果场景发生变化,调用Destroy
之后的帧,或者紧跟在destroimmediate
之后,就会发生这种情况
最后,许多Firebase函数都有一个Async
和同步变量(例如:CheckDependenciesAsync
和CheckDependenciesAsync
)。我不认为实时数据库本身有什么需要调用的,但是如果您使用函数的非异步变体(或者如果您在完成任务时锁定,包括忘记在协同程序中生成),游戏肯定会冻结一段时间。请记住,任何云产品都是i/o绑定的,通常运行速度比游戏的更新循环慢(尽管Firebase尽可能快)
我希望这有帮助
--帕特里克