Четверг, 21 Ноября 2024, 20:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Inventory БД
zisXДата: Четверг, 14 Января 2016, 08:03 | Сообщение # 1
Neto Zis
Сейчас нет на сайте
Добрый день, если кто-то знаком уже с этой темой прошу направить меня на путь истинный.

Задача состоит в том, что нужно сохранять инвентарь игрока в базе данных на сервере.
У меня есть идея, я на сервере (photon server) писал свой класс сериализации, писал я его для того что бы отправлять клиенту список игроков в массиве байтов, работает это на ура.
Так вот в чем идея, добавить в уже существующую таблицу Players текстовое поле, но хранить я буду там сериализованный инвентарь игрока, как вы думаете зайдет?

P.S. Если не зайдет или это будет затратно, то есть ещё вопрос, когда игрок получает в свой инвентарь что-то, то мне сразу добавлять это в бд или хранить в памяти сервера, но каждые допустим 15 мин все сбрасывать в бд.


KwantДата: Четверг, 14 Января 2016, 08:25 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Обычно ММО, где много разных действий/изменений, всё удерживают в памяти и сбрасывают данные в БД после выхода игрока из игры/отключения сервера/по истечению N интервала времени. Вот только такой подход требует крайне надёжного сервера.

Если людей мало, кол-во операций над БД не так много, а БД настроена и выбрана разумно, то можно прямо сразу и в БД.


Сообщение отредактировал Kwant - Четверг, 14 Января 2016, 08:28
BUFFOMETZДата: Четверг, 14 Января 2016, 16:00 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Не по наслышке видел много серверов у которых в случае сбоя откат на несколько часов бывает - играется вполне нормально.
zisXДата: Четверг, 14 Января 2016, 16:02 | Сообщение # 4
Neto Zis
Сейчас нет на сайте
Kwant, BUFFOMETZ, Как на счет сериализации ?

BUFFOMETZДата: Четверг, 14 Января 2016, 16:29 | Сообщение # 5
почетный гость
Сейчас нет на сайте
zisX, Простите, я не улавливаю связи между хранением инвентаря на сервере и последующим сбросом в БД и сериализацией между сервером и игроком. Пусть лучше спецы что-то путного подскажут. smile
zisXДата: Четверг, 14 Января 2016, 16:35 | Сообщение # 6
Neto Zis
Сейчас нет на сайте
BUFFOMETZ, Я имел ввиду не создавать много полей в базе данных для инвентаря, допустим id предмета, название, кол-во и так далее.
А создать одно поле допустим с названием Inventory, тип Text.
На сервере сериализуем массив слотов инвентаря, вот отрывок кода который сериалезует лист клиентов на сервере
и делать так же только за место игроков использовать слоты инвентаря и записывать в бд
Код

Packet packet = new Packet();
List<UnityClient> localClients;
localClients = World.Instance.clients;

packet.AddInt(localClients.Count);
for (int i = 0; i < localClients.Count; i++)
{
packet.AddInt(localClients.id); //ID Игрока
packet.AddFloat(localClients.position.X); //Позиция игрока по X в мире
packet.AddFloat(localClients.position.Y); //Позиция игрока по Y в мире
packet.AddFloat(localClients.position.Z); //Позиция игрока по Z в мире
}

packet.Pack();

byte[] packetByte = packet.buffer; // Массив байтов листа игроков


Класс Packet - тык




Сообщение отредактировал zisX - Четверг, 14 Января 2016, 16:38
BUFFOMETZДата: Четверг, 14 Января 2016, 16:43 | Сообщение # 7
почетный гость
Сейчас нет на сайте
zisX, забьет канал если инвентарь большой и игроков много.
Плюс возможность дюпа предметов. - не факт


Сообщение отредактировал BUFFOMETZ - Четверг, 14 Января 2016, 16:48
zisXДата: Четверг, 14 Января 2016, 16:58 | Сообщение # 8
Neto Zis
Сейчас нет на сайте
BUFFOMETZ,
Цитата BUFFOMETZ ()
Плюс возможность дюпа предметов.

Каким образом?

Добавлено (14 января 2016, 16:58)
---------------------------------------------
Цитата zisX ()
забьет канал если инвентарь большой и игроков много.


Как на счет создать на сервере лист операций, а операция будет в себе содержать допустим, поменять кол-во монет у такого то игрока.

1 операцию выполнять каждые n секунд или миллисекунд.
В принципе можно ускорить этот процесс создав несколько "шардов" в каждом из которых будет свой лист операций и они чекая операцию будут выполнять её.




Сообщение отредактировал zisX - Четверг, 14 Января 2016, 16:59
VinchensooДата: Четверг, 14 Января 2016, 17:01 | Сообщение # 9
Злобный социопат с комплексом Бога
Сейчас нет на сайте
zisX, теоретически, если БД используется тупо как хранилище, а вся обработка идет на сервере логики, то хранить так можно.
Минусы:
1. Если есть операции с инвентарем на уровне БД (не просто достать при логине и сохранить при логауте, а, например, добавление конкретного предмета в инвентарь и моментальное сохранение состояния в базе), то возникают локи при обработке
2. Сложно что-то попрвить вручную или SQL скриптом (если сериализуем в текстовый формат, то проблема стоит менее остро)
3. Невозможно восстановить в случае повреждения информации (взяли и выключили свет во время записи на диск, получили кашу из байт, которые никак не разгрести)

Ну и все такое прочее
Цитата BUFFOMETZ ()
zisX, забьет канал если инвентарь большой и игроков много.

Ничего не забьет, размер траффика вполне сравнимый.


zisXДата: Четверг, 14 Января 2016, 17:15 | Сообщение # 10
Neto Zis
Сейчас нет на сайте
Vinchensoo,
Цитата Vinchensoo ()
2. Сложно что-то попрвить вручную или SQL скриптом (если сериализуем в текстовый формат, то проблема стоит менее остро)


Можно пойти дальше и написать маленькую утилиту (visual studio c# ) которая будет как редактор инвентаря игроков.
Которая будет десериализовывать инвентарь, потом мы редактируем инвентарь с помощью интерфейса, а потом сериализовать и отправить в бд.

Добавлено (14 января 2016, 17:15)
---------------------------------------------
Vinchensoo,

Цитата Vinchensoo ()
3. Невозможно восстановить в случае повреждения информации (взяли и выключили свет во время записи на диск, получили кашу из байт, которые никак не разгрести)

Выключили свет у клиента или у сервера? Можно поподробней я не очень понял.


VinchensooДата: Четверг, 14 Января 2016, 17:26 | Сообщение # 11
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Цитата zisX ()
Можно пойти дальше и написать маленькую утилиту (visual studio c# ) которая будет как редактор инвентаря игроков.
Которая будет десериализовывать инвентарь, потом мы редактируем инвентарь с помощью интерфейса, а потом сериализовать и отправить в бд

Можно, но зачем, когда проще нормально хранить инвентарь в бд? Для таких вещей давно придумали ORM.

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

Но если делать аккуратно, должно быть норм)
Цитата zisX ()
Выключили свет у клиента или у сервера? Можно поподробней я не очень понял.

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


BUFFOMETZДата: Четверг, 14 Января 2016, 17:43 | Сообщение # 12
почетный гость
Сейчас нет на сайте
Цитата zisX ()
Каким образом?

Примерно одновременная отправка пакетов, достаточно сделать так, чтобы сервер скачал наш инвентарь из БД дважды и произвел в них изменения не успев запаковать и сохранить предыдущие изменения.
Я бы попробовал что-то сделать при торге с другими игроками. Например отправил бы двум разным игрокам по 100 рублей одновременно, имея при этом всего стольник. Сервер в итоге записал бы в бд что у меня 0 рублей, а у игрока А и Б по плюс 100.
Это просто пример конечно, что теоретически это возможно. Запретить одновременный торг можно, но получится ли найти все лазейки? Это надо смотреть на готовом продукте.
Рано или поздно получится обмануть сервер и заставить его сохранить инвентарь в свою пользу.

UPD. Чето я тут намудрил на ночь глядя походу. Вы же хотите только от сервера к БД так делать, и в обратную сторону. :D
Хотя сервер все равно обмануть можно. biggrin biggrin


Сообщение отредактировал BUFFOMETZ - Четверг, 14 Января 2016, 17:50
robertonoДата: Четверг, 14 Января 2016, 17:54 | Сообщение # 13
Чокнутый Кот
Сейчас нет на сайте
BUFFOMETZ, насколько мне известно, для операций в несколько шагов существуют транзакции, исключающие такие случаи.
BUFFOMETZДата: Четверг, 14 Января 2016, 18:13 | Сообщение # 14
почетный гость
Сейчас нет на сайте
robertono, ну транзакция работает в самой БД непосредственно, нам не нужно менять данные во время транзакции в БД, а на сервере же ее нет.
Пример - сервер говорит:
1. сохрани "Вася001, Автомат, 0 рублей".
2. сохрани "Вася001, Автомат, 0 рублей".
3. сохрани "Петя, Автомат, 200 рублей".
4. сохрани "Игорь, Автомат, 200 рублей".

БД то не знает законов игры, она делает только что ей говорят, верно?
К тому же сервер одновременно разбирается с сотнями игроков, никто же не ждет очереди. Тут не несколько шагов, а разные по своей сути вещи, выполняемые примерно в одно время.

Я повторю - это просто пример, который наверное нигде не будет работать, но есть тысячи других вариантов.
Дюпали и дюпают во всех играх, от майнкрафта и доты 2 до ворлд оф варкрафт и архиейдж. Что уж говорить о самописном сервере.


Сообщение отредактировал BUFFOMETZ - Четверг, 14 Января 2016, 18:20
VinchensooДата: Четверг, 14 Января 2016, 18:20 | Сообщение # 15
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Цитата BUFFOMETZ ()
robertono, ну транзакция работает в самой БД непосредственно, нам не нужно менять данные во время транзакции в БД, а на сервере же ее нет.

Можно сделать.

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


BUFFOMETZДата: Четверг, 14 Января 2016, 18:24 | Сообщение # 16
почетный гость
Сейчас нет на сайте
Цитата Vinchensoo ()

Можно сделать.

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

Не буду спорить с вами, я дилетант в этом деле. biggrin
robertonoДата: Четверг, 14 Января 2016, 19:55 | Сообщение # 17
Чокнутый Кот
Сейчас нет на сайте
Думаю если правильно работать с БД (и транзакциями), то никаких дюпов не будет.
VinchensooДата: Пятница, 15 Января 2016, 11:12 | Сообщение # 18
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Про транзакции

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


vpcoderДата: Вторник, 19 Января 2016, 13:00 | Сообщение # 19
был не раз
Сейчас нет на сайте
Цитата
У сервера базы данных. Физически это может быть другой компьютер, не тот, на котором запущен сервер логики.

Интересная картина)) Думаю, это не относится к реальным ситуациям) Хотя, теоретически, уборщица может угробить пару облачных серверов...

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

Мало информации. Нужны подробности - что вызывает клиент, что отвечает сервер и в какие моменты.
Если нужно просто получить список игроков - инвентари отправлять крайне нежелательно, логичнее запрашивать каждый инвентарь отдельного персонажа по идентификатору в потоке. Если требуется загрузить своего игрока с его инвентарём, очевидно, удобно сразу получить и игрока и инвентарь в одном текстовом блоке.

Цитата
P.S. Если не зайдет или это будет затратно, то есть ещё вопрос, когда игрок получает в свой инвентарь что-то, то мне сразу добавлять это в бд или хранить в памяти сервера, но каждые допустим 15 мин все сбрасывать в бд.

если игрок что то получил/потерял - сразу можно это фиксировать. Но, это не рассчитано на тысячи людей в онлайне, так что, надо отталкиваться от ваших замахов)


Немного музыки - ArtMetal
VinchensooДата: Вторник, 19 Января 2016, 16:01 | Сообщение # 20
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Цитата vpcoder ()
Интересная картина)) Думаю, это не относится к реальным ситуациям) Хотя, теоретически, уборщица может угробить пару облачных серверов...

На конференции хайлоад в 2011 году, если не ошибаюсь, люди из Вконтакте рассказывали, сколько они жестких дисков выбрасывают в сутки из-за того, что они физически умирают.
Так что не так уж и невозможно.

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


  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг