PDA

Просмотр полной версии : Кто-нибудь делал синхронизацию игр на нескольких девайсах?


mikhailk
20.01.2016, 14:40
Вся особенность в том, что заказчик хочет оффлайн-режим.

Допустим, пользователь открыл приложение на одном дейвайсе, скачал с сервера профиль: у перса 10-й уровень. Пользователь отключился от Интернета и играет себе. Доиграл перса до 15-го уровня. Бросил.

Открыл приложение на втором девайсе, скачал с сервера тот же профиль (10-й уровень перса), поиграл без отключения от Интернета, прокачал перса до 20-го уровня, после каждого получения нового уровня перса, этот новый уровень фиксировался на сервере. Закрыл игру.

Возобновил игру на первом девайсе, подключился к Интернету, получил 16-й уровень у перса, приложение лезет на сервер и происходит конфликт - оно хочет записать свои данные (16-й уровень), но там сохранка другой копии игры (20-й уровень).

Как разрулить?

ЗЫ. Применение правил вроде "записывать более старший уровень" не предлагать - там данных много больше, уровень просто для иллюстрации.

undefined
20.01.2016, 14:50
мы делали так: при конфликте выскакивает диалог:
Существует более актуальный стейт.Подгрузить?/остаться при своих.

Добавлено через 3 минуты
хотя если нельзя однозначно сказать какой из профилей актуальнее, все конечно сложнее.

Добавлено через 7 минут
хотя можно в деталях описывать юзеру оба стейта с намеком, что два стейта быть не может и пусть сам решает.

mikhailk
20.01.2016, 15:36
У нас описать сложно. Пользователь покупает юнитов, экипирует их, зарабатывает очки.
Но видимо придется все-таки делать так. Пусть пользователь решает какой из стейтов делать актуальным для игры.

undefined
20.01.2016, 16:25
У нас описать сложно
можно показывать дату создания стейта+девайс, с которого он был записан.Хотя, в свете того, что андройд может быть и многооконным (http://www.jide.com/en/remixos) непонятно как оно себя поведет.

mikhailk
20.01.2016, 16:35
у нас пока iOS
да, видимо дату стейта и будем показывать

mikhailk
28.01.2016, 12:10
Возник чисто технический вопрос.

1. Игра сохранена с устройства-1, допустим, игровые данные версии 123, после чего игра на устройстве-1 закрыта
2. Игра открывается на устройстве-2, в нее загружаются игровые данные версии 123
3. Через некоторое время игра пытается сохраниться с устройства-2, игровые данные версии 124

Вот здесь вроде как конфликт, поскольку игровые данные версии 124 с устройства-2 перезаписывают игровые данные версии 123 с устройства-1, но для пользователя данный конфликт будет выглядеть странно, поскольку он же не играл в это время на устройстве-1. Если по уму, то конфликта и нет.

Иначе говоря, если пользователь попеременно играет в игру на двух устройствах, закрывая на одном и открывая на другом, то конфликта быть не должно, хотя по формальным правилам он как бы есть.

Кто как это разруливает?

caseyryan
28.01.2016, 12:26
Что-то я никак не уловлю в чем проблема с определением актуальности. Если у тебя на локалке уровень игрока 20, а на сервере 16, то грузи с локалки на сервер, если необорот, то с сервера на локалку. Проверка даты создания - это совершенно ненадежный способ. Он может по ошибке не ту дату выставил, и данные записались.
Или вообще сделай наличие интернета обязательным условием

undefined
28.01.2016, 12:31
Так и не понял в чем конфликт.Что юзер продолжает на девайсе-2 играть с того места, где он остановился на девайсе-1 и потом девайс-1 подцепляет новый стейт - так это никакой не конфликт т.к. учетка то одна.Можно конечно для каждого девайса делать форк, но тут велик шанс закопаться

Добавлено через 1 минуту
Что-то я никак не уловлю в чем проблема с определением актуальности. Если у тебя на локалке уровень игрока 20, а на сервере 16, то грузи с локалки на сервер, если необорот, то с сервера на локалку.
Применение правил вроде "записывать более старший уровень" не предлагать - там данных много больше, уровень просто для иллюстрации.

Он может по ошибке не ту дату выставил, и данные записались.
Кто он? юзер?Дату то сервер назначает.

mikhailk
28.01.2016, 12:36
Заказчик настаивает на возможности запуска игры пользователем в оффлайне, т.е., Интернет будет недоступен.

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

Для упрощения можно считать, что там несколько мини-игр, в каждой из которых можно выиграть игровую валюту и ли призы. Соответственно, на устройстве-1 пользователь поиграл в мини-игры 1 и 3 и выиграл 100 тугриков и плюшевого медведя, а на устройстве-2 пользователь поиграл в мини-игру 2 и выиграл 50 тугриков и зайца.

Понятное дело, постоянный доступ к Интернету решил бы все проблемы вообще, но Заказчик стоит насмерть, как пуговица.

undefined
28.01.2016, 12:44
А ну да, забыл по инет.Можешь в своей предыдущий пример добавить информацию где у юзера был инет, а где его нет?

caseyryan
28.01.2016, 12:48
Применение правил вроде "записывать более старший уровень" не предлагать - там данных много больше, уровень просто для иллюстрации.
За счет чего тогда формируется этот "уровень"? По мне так уровень должен быть чем-то вроде контрольной суммы, но в более упрощенном виде. И все "штучки" игрока должны быт ьв него встроены

mikhailk
28.01.2016, 12:48
Так и не понял в чем конфликт.Что юзер продолжает на девайсе-2 играть с того места, где он остановился на девайсе-1 и потом девайс-1 подцепляет новый стейт - так это никакой не конфликт т.к. учетка то одна.

Ок, усложняем задачу.

1. Игра сохранена с устройства-1, допустим, игровые данные версии 123, после чего игра на устройстве-1 закрыта
2. Игра открывается на устройстве-2, в нее загружаются игровые данные версии 123
3. Через некоторое время игра пытается сохраниться с устройства-2, перезаписав игровые данные версии 124 поверх игровых данных 123 с устройства-1. Допустим, сохранение происходит успешно.
4. Игра снова запускается на устройстве-1, но в оффлайне, т.е., стартует не с 124-й версии игровых данных, сохраненной на сервере, а с 123-й, имеющейся на устройстве-1.
5. Через некоторое время на устройстве-1 появляется Интернет и игра пытается сохраниться с устройства-1, сгенерировав свои игровые данные версии 124. Но на сервере уже есть данные версии 124 с устройства-2. Тут, по идее, надо сообщить пользователю, что возник конфликт.

Вопрос. Чем случай п.5 отличается от случая п.3? Как определить, что в п.3 конфликта не было, а в п.5 он есть?

undefined
28.01.2016, 12:55
ну так в п.3, как я понял, все идет штатно, а в п.5 действительно конфликт т.к. версия 124 уже есть на сервере и он легко может это определить и тогда юзеру придется выбирать.

Добавлено через 4 минуты
Т.е. конфликт определять должен сервер, глядя на то есть ли уже такая версия.

mikhailk
28.01.2016, 13:03
Ну, устройств может быть несколько и с номерами версий может выйти котовасия, но в принципе, наверное, действительно можно попробовать поработать с номерами версий...

dark256
28.01.2016, 17:07
.... Потом юзер такой звонит в техсуппорт и предъявляет:
- Я влил в игруху 1000 баксов дошел до 80-го уровня а тут вдруг вошел что-то нажал и у меня стал 16й уровень верните деньги....

Tails
28.01.2016, 17:18
Наверное на мобилках есть какой-то лог, по транзакциям.

Korchy
29.01.2016, 11:13
А что мешает сделать в учетке пользователя подучетки на каждый девайс, раз разделение так необходимо?

mikhailk
29.01.2016, 13:45
А что мешает сделать в учетке пользователя подучетки на каждый девайс, раз разделение так необходимо?

Да в общем-то ничего не мешает. А что это даст?
На самом деле, необходимо не разделение, а понятная пользователю процедура синхронизации игры на разных девайсах.


.... Потом юзер такой звонит в техсуппорт и предъявляет:
- Я влил в игруху 1000 баксов дошел до 80-го уровня а тут вдруг вошел что-то нажал и у меня стал 16й уровень верните деньги....

Да, что-то подобное вполне может быть.

На самом деле, была идея вообще обойтись без собственного игрового сервера, а профиль пользователя хранить в iCloud. Понятное дело, что пополнение баланса через InAppPurchase по-любому требует Интернета. Планируется так же потребовать Интернет на операции расходования денег. Но что делать, если на одном девайсе, подключенном к Интренету пользователь закинул 25 баксов и потратил из них 10, а на другом девайсе в оффлайне просто играл, наиграл там себе какой-то результат и затем решил синхронизироваться, то, что делать мне пока не очевидно. Понятное дело, игровые данные с финансовыми транзакциями затирать нельзя. Значит потеряется результат.

dark256
29.01.2016, 16:31
Если у юзера будет прямой доступ хоть к облаку, хоть к чему - ну... готовьтесь дарить много денег :)
ИМХО - нонсенс парапсихолога это всё. Клиент (заказчик) пролетит как фанера над Парижем с такими опциями.

illuzor
29.01.2016, 17:02
Есть огромное количество игр с хранением сейвов в облаке. Почему бы не взять одну из них и не посмотреть, как всё реализовано?

Korchy
30.01.2016, 09:58
Да в общем-то ничего не мешает. А что это даст?

Как раз к тому, что синхронизация будет четко по выбору клиента и не возникнет никаких проблем. Если клиент заходит с устройства 1 - не важно, какой уровень он набил на устройстве 2. Синхронизация идет только с первой подучеткой. Перекинуть данные с устройства 2 должна быть кнопка "нажал - загрузил" Если там уровень меньше - предупреждение, при согласии - перезапись.

mikhailk
02.02.2016, 16:09
Есть огромное количество игр с хранением сейвов в облаке. Почему бы не взять одну из них и не посмотреть, как всё реализовано?

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

В моем случае заказчик хочет функционал, который по-хорошему требует постоянный онлайн и собственный сервер. Но он хочет оффлайн и сохранение в облаке.


Как раз к тому, что синхронизация будет четко по выбору клиента и не возникнет никаких проблем. Если клиент заходит с устройства 1 - не важно, какой уровень он набил на устройстве 2. Синхронизация идет только с первой подучеткой. Перекинуть данные с устройства 2 должна быть кнопка "нажал - загрузил" Если там уровень меньше - предупреждение, при согласии - перезапись.

Вопрос с деньгами останется.

Например:
1. В игре на устройстве-1 баланс 100 монет и на устройстве-2 - то же самое. Устройство-1 подключено к Инету, устройство-2 - нет.
2. Юзер на устройстве-1 пополнил за реальные деньги баланс на 1000 монет, из которых 500 тут же потратил на игровые нужды, теперь на балансе 600 монет.
3. Юзер включает Инет на устройстве-2. Там по прежнему 100 монет на балансе?

undefined
02.02.2016, 16:15
Конкретно в данном случае правильно было бы подгрузить стейт с сервера где (600 монет).И вообще что-то мне подсказывает, что серверные данные всегда должны иметь приоритет перед локальными.

mikhailk
02.02.2016, 16:37
Честно говоря, я пытаюсь дожать заказчика на железный онлайн с одной копией игры в эфире. Иначе проблем не избежать по-любому.

undefined
02.02.2016, 18:02
Радикально как-то.Имхо лучше жестко юзеру говорить что у него всего одна учетка.

Korchy
02.02.2016, 19:17
Т
Вопрос с деньгами останется.

Например:
1. В игре на устройстве-1 баланс 100 монет и на устройстве-2 - то же самое. Устройство-1 подключено к Инету, устройство-2 - нет.
2. Юзер на устройстве-1 пополнил за реальные деньги баланс на 1000 монет, из которых 500 тут же потратил на игровые нужды, теперь на балансе 600 монет.
3. Юзер включает Инет на устройстве-2. Там по прежнему 100 монет на балансе?

Да, там по прежнему 100р на балансе. И кнопка мигает - "вы заходили с устройства 2, желаете перенести достижения? (Y/N)".