В какой момент производить запись в БД?
Добавлено:
21 сен 2017, 18:32
DarkDeivel
Всем привет! Добрался я до такой для меня важной темы как сохранение прогресса в БД. Проблема в том что я не совсем понимаю в какие моменты мне отправлять данные в БД и как лучше. Наверное что касается денег там попроще будет, во время покупки\продажи\подбора отправлять запрос в БД и обновлять значение(если я не прав поправьте пожалуйста), а вот как быть с координатами х,у,z? Каждый кадр отправлять это круто слишком, может быть отправлять каждые там 3-5 секунд в БД новые значения? Спасибо всем за помощь!
Я использую Photon Cloud.
Re: В какой момент производить запись в БД?
Добавлено:
22 сен 2017, 15:35
Shekn
Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.
Re: В какой момент производить запись в БД?
Добавлено:
22 сен 2017, 16:00
DarkDeivel
Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.
Спасибо за первый ответ! Про выход из игры я конечно думал, но вдруг резко выкинет(интернет отвалится или свет выключат). Как сохранять инвентарь? Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально? В какой момент нужно всё сохранять(подобрал\купил\выкинул)?
Re: В какой момент производить запись в БД?
Добавлено:
22 сен 2017, 17:26
Woolf
Я использую Photon Cloud
ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.
Re: В какой момент производить запись в БД?
Добавлено:
23 сен 2017, 07:11
DarkDeivel
Woolf писал(а):Я использую Photon Cloud
ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.
Я хочу от него отказаться т.к. я на нем учился, но я сразу заранее про БД и спрашиваю когда и как записывать.
Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре... У ла2 предметы хранятся в xml в виде:
Используется xml
<?xml version="1.0" encoding="UTF-8"?>
-<list>
-<item name="short_sword" id="1">
-<for>
<set stat="pAtk" order="0x08" val="8"/>
<set stat="mAtk" order="0x08" val="6"/>
<set stat="rCrit" order="0x08" val="8"/>
<add stat="accCombat" order="0x10" val="0"/>
<set stat="pAtkSpd" order="0x08" val="379"/>
<enchant stat="pAtk" order="0x0C" val="0"/>
<enchant stat="mAtk" order="0x0C" val="0"/>
</for>
</item>
</list>
Это довольно таки удобно, но я не пойму где это на сервере хранится и как оно считывается...
Можно конечно сделать таблицу в БД и назвать её items и в каждой строчке эти параметры указывать, но почему-то мне кажется вариант xml как выше лучше?
Re: В какой момент производить запись в БД?
Добавлено:
24 сен 2017, 14:57
IDoNotExist
DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...
Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.
Re: В какой момент производить запись в БД?
Добавлено:
25 сен 2017, 07:28
DarkDeivel
IDoNotExist писал(а):DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...
Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.
Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.
Re: В какой момент производить запись в БД?
Добавлено:
25 сен 2017, 08:28
IDoNotExist
DarkDeivel писал(а):Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.
Хранить на сервере, передавать с сервера на клиент.
Re: В какой момент производить запись в БД?
Добавлено:
27 сен 2017, 01:02
Alex_Hell
если хочешь надежно и в меру не-крякабельно, то вся логика на сервере, например клиент говорит серву "открой сундук", серв выполняет код который проверяет шанс выпадения предмета, выдает предмет в инвентарь (в памяти, и сохраняет синхронно/асинхронно в БД возможно сразу а возможно батчами раз в N сек), и сообщает клиенту что он получил и должен показать юзеру.
конфиги предметов - статы урон, и что там еще - храни на сервере, передавай при старте на клиент в виде JSON (не XML), в юнити есть парсер JSON. Для серва тоже - на PHP,Java.
Как БД не выбирай файлы, они запароться могут, и работать "правильно" с ними сложней, изучи СУБД типа MySQL, и юзай SQL скрипты с серверной стороны вызываемые на UPDATE/INSERT/SELECT.
В таблице предметов можешь ввести например:
(long) UserId - (long) ItemTypeId
1 - 1
1 - 2
2 - 1
2 - 3
тут понятно какие предметы имеются в инвентаре какого игрока,
а по ItemTypeId понятно что за характеристики из сопутствующего связанного конфига ItemTypeId -> ItemInfo , с любыми под-параметрами, в зависимости от того на сколько универсальна система - какие атрибуты и на сколько одинаковые у предметов есть, может быть, может быть если это Урон у всех оружий, Броня у доспехов, тут можешь делить ItemType еще как Id 1 например Оружий, Id 2 Броня.
Главное во всех ID не запутаться, т.к. каждый из своего множества, т.е апельсины с человеками не смешивать
Re: В какой момент производить запись в БД?
Добавлено:
27 сен 2017, 01:05
Alex_Hell
DarkDeivel писал(а):Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.
Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально?
СУБД для миллионов строк и придуманы, есть индексы для быстрого поиска, чтобы не выбирать все строки в поиске предметов нужного игрока по ID, или удалении предмета по Id предмета у Id игрока.