Постоянная база данных Firebase при первой установке - PullRequest
0 голосов
/ 14 января 2020

Мое текущее приложение, разработанное в Unity, использует базу данных Firebase Realtime с включенным постоянством базы данных. Это прекрасно работает для автономного использования приложения (например, в областях, где отсутствует сигнал).

Однако, если новый пользователь запускает приложение впервые без соединения inte rnet - приложение зависает. Я полагаю, это потому, что для того, чтобы персистентность работала, необходимо в первый раз отключить базу данных.

Мне известны такие потоки, как: ' Обнаружение, если соединение Firebase потеряно / восстановлено ', который говорит об обработке отключения базы данных от Firebase.

Тем не менее, могу ли я в любом случае проверить, являются ли пользователи впервые использующими приложение (например, из-за наличия постоянной базы данных?). Затем я могу сообщить им, что они должны go онлайн для «первой настройки»?

Ответы [ 2 ]

0 голосов
/ 14 января 2020

В дополнение к ответу @ frank-van-puffelen, я не верю, что Firebase RTDB сама по себе должна приводить к блокировке вашей игры до тех пор, пока не будет установлено сетевое соединение. Если ваша игра доступна при первом запуске без подключения к сети (ie: для вашей логики c не требуется начальное состояние из сети), вы можете проверить следующие проблемы:

Убедитесь, что вы можете справиться с null. Если ваша игровая логика c находится в Coroutine, Unity может решить молча остановить ее, а не полностью потерпеть неудачу.

Если вы взаимодействуете с базой данных через Транзакции , обычно предполагается, что он будет выполняться дважды (один раз для вашего локального кэша, затем снова, когда кэш синхронизируется с сервером, если значение отличается). Это означает, что в первый раз, когда вы выполняете изменение с помощью транзакции, у вас, скорее всего, будет null предыдущее состояние.

Если вы можете, предпочтите прослушать ValueChanged вместо GetValueAsyn c. Вы всегда будете получать этот обратный вызов в своем основном потоке Unity, вы всегда будете получать обратный вызов при регистрации с данными в локальном кэше, и данные будут периодически обновляться по мере обновления сервера. Кроме того, если вы видите @ frank-van-puffelen ответ в другом месте , если вы используете GetValueAsync, вы можете не получить ожидаемые данные (включая ноль, если пользователь не в сети). Если ваша игра заморожена, потому что она ожидает ContinueWithOnMainThread (всегда предпочитайте это ContinueWith в Unity, если у вас нет причин не делать этого) или await, это может ValueChanged также обойти это ( Я не думаю, что это так).

Дважды проверьте время жизни вашего объекта. Существует множество причин, по которым приложение может зависнуть, но при работе с асинхронной логикой c определенно убедитесь, что вы знаете о различиях между жизненным циклом Unity GameObject и типичным жизненным циклом объекта C# ( см. Это post и мой собственный , взаимодействующий с асинхронными логами c с Unity и Firebase ). Если объект OnDestroy вызывается до await, ContinueWith[OnMainThread] или ValueChanged, вы рискуете столкнуться с нулевыми ссылками в своем собственном коде. Это может произойти, если сцена изменяется, вызывается кадр после Destroy или сразу после DestroyImmediate.

Наконец, многие функции Firebase имеют Async и синхронный вариант (например: CheckDependencies и CheckDependenciesAsync). Я не думаю, что есть что-то, что можно было бы вызывать для самой базы данных реального времени, но если вы используете не-асиновый c вариант функции (или если вы закручиваете блокировку при завершении задачи, в том числе забываете yield в сопрограмме) , игра определенно остановится на некоторое время. Помните, что любой облачный продукт связан с вводом-выводом по своей природе и, как правило, будет работать медленнее, чем обновление вашей игры l oop (хотя Firebase старается быть максимально быстрым).

Надеюсь, это поможет !

- Патрик

0 голосов
/ 14 января 2020

В API-интерфейсе базы данных Firebase нет ничего, чтобы определить, был ли заполнен его автономный кеш.

Но вы можете обнаружить, когда устанавливаете соединение с базой данных, например, прослушивая узел .info/connected . И затем, когда это первое значение установлено на true, вы можете установить локальный флаг в локальном хранилище, например, в PlayerPrefs.

С этим кодом вы можете определить, является ли флаг установите в PlayerPrefs и, если нет, покажите пользователю сообщение о том, что ему необходимо иметь сетевое соединение для загрузки исходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...