【问题标题】:Firebase Persistent database on first installation首次安装时的 Firebase 持久数据库
【发布时间】:2020-01-14 14:18:31
【问题描述】:

我当前在 Unity 中开发的应用程序使用启用了数据库持久性的 Firebase 实时数据库。这非常适合离线使用应用程序(例如在没有信号的区域)。

但是,如果新用户在没有互联网连接的情况下首次运行应用程序 - 应用程序将冻结。我猜,这是因为它需要第一次拉下数据库才能使持久性工作。

我知道诸如“Detect if Firebase connection is lost/regained”之类的线程谈论处理与 Firebase 的数据库断开连接。

但是,无论如何,我是否可以检查用户是否是第一次使用该应用程序(例如,通过持久性数据库的存在?)。然后我可以通知他们必须上网进行“首次设置”?

【问题讨论】:

    标签: firebase unity3d firebase-realtime-database


    【解决方案1】:

    Firebase 数据库 API 中没有任何内容可以检测其离线缓存是否已填充。

    但您可以检测何时连接到数据库,例如通过listening to the .info/connected node。然后当第一个设置为true时,您可以在本地存储中设置一个本地标志,例如PlayerPrefs

    使用此代码,您可以检测是否在PlayerPrefs 中设置了标志,如果没有,则向用户显示一条消息,告知他们需要网络连接才能下载初始数据。

    【讨论】:

      【解决方案2】:

      除了@frank-van-puffelen 的回答,我认为 Firebase RTDB 本身不会导致您的游戏锁定,直到出现网络连接。如果您的游戏在首次启动时无需网络连接即可玩(即:您的逻辑本身不需要来自网络的某些初始状态),您可能需要检查以下问题:

      确保您可以处理null。如果您的游戏逻辑在 Coroutine 中,Unity 可能会决定静默停止它而不是完全失败。

      如果您通过Transactions 与数据库进行交互,通常假设它将运行两次(一次针对您的本地缓存,如果值不同,则在缓存与服务器同步时再次运行)。这意味着当您第一次通过事务执行更改时,您可能会拥有 null 之前的状态。

      如果可以的话,更喜欢听ValueChanged 而不是GetValueAsync。您将始终在您的主 Unity 线程上获得此回调,您将始终在注册本地缓存中的数据时获得一次回调,并且数据将随着服务器更新而定期更新。此外,如果您看到 @frank-van-puffelen answer elsewhere,如果您使用的是 GetValueAsync,您可能无法获得您期望的数据(如果用户离线,则包括 null)。如果您的游戏因为等待ContinueWithOnMainThread(除非您有理由不这样做,否则在Unity 中总是更喜欢ContinueWith)或await 声明而被冻结,这可能ValueChanged 也可以解决这个问题(我认为不应该是这样)。

      仔细检查您的对象生命周期。应用程序可能会冻结的原因有很多,但在处理异步逻辑时,一定要确保您了解 Unity 的 GameObject 生命周期和 C# 的典型对象生命周期之间的差异(see this post 和我自己的 interacting with asynchronous logic with Unity and Firebase)。如果在调用awaitContinueWith[OnMainThread]ValueChanged 之前调用对象OnDestroy,则您有在自己的代码中遇到空引用的危险。如果场景发生变化、调用Destroy 之后的帧或紧随DestroyImmediate 之后的帧,就会发生这种情况。

      最后,许多 Firebase 函数都有 Async 和同步变体(例如:CheckDependenciesCheckDependenciesAsync)。我不认为有任何需要调用实时数据库,但如果你使用函数的非异步变体(或者如果你在任务完成时自旋锁定,包括在协程中忘记yield),游戏肯定会冻结一点。请记住,任何云产品本质上都是 i/o 绑定的,并且通常会比游戏的更新循环运行得更慢(尽管 Firebase 会尽可能快)。

      我希望这会有所帮助!

      --帕特里克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2019-02-22
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 2023-03-28
        • 2016-10-19
        • 2020-03-28
        相关资源
        最近更新 更多