Хранение данных в игре (2)

(Только для группы "MOSC ДизДок") Здесь идёт написание Дизайн Документа для игры "Master of Star Control".
Закрыто
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Хранение данных в игре (2)

Сообщение Vasaka »

Сообщение от: krupennikov


Виртуальная (автономная) база данных это такая же реляционная база данных (SQL, oracle, MySQL и т.д.).

Пример для определения отличий.

Для работы с реляционной БД требуется установленное в операционной системе (Windows) ПО(желательно бесплатное) для работы с данным типом БД. Для создания файла БД требуется:
- создать необходимые таблицы.
- создать столбцы в таблицах с требуемыми параметрами (обычно делается в стороннем ПО). Делается один раз, т.к. в следующий раз при добавлении нового столбца в таблицу, данные этой таблицы стираются. Для сохранения данных, придется писать дополнительный код, который переносит данные из старой таблицу в новую.


Для изменения данных в БД необходимо:

- подключиться к файлу БД.
- считать необходимые данные из таблиц БД в переменные (массивы).
- изменить их.
- сохранить измененные считанные данные таблиц обратно в файл БД.
- отключиться от файла БД.


Для работы с автономной БД дополнительное ПО не требуется. Для создания БД требуется:
- программно создать БД одной строкой типа: DataSet dataBase = new DataSet("nameDataBase");
- добавить в базу данных необходимое количество таблиц примерно так: DataTable table1 = new DataTable("nameTable1"); DataSet.Tables.Add(table1); ...
- добавить необходимые столбцы с требуемыми параметрами в таблицы: table1.Columns.Add("column1"); table1.Columns.Add("column2"); ...
Добавлять столбцы в таблицы и создавать/добавлять новые таблицы в БД можно в любое время, даже в процессе выполнения программы без потери данных.

- сохранить БД в одном из форматов (XML или бинарный/двоичный).
- также можно сохранять все таблицы отдельными файлами, при этом строки кода с DataSet убираются.


сохранять БД или таблицы требуется только в том случае если необходимо дальнейшая работа с ними.


Для изменения данных автономной БД требуется:
- создать программно БД или таблицы, либо загрузить имеющуюся: DataSet dataBase = new DataSet(); dataBase.ReadXml(путь); либо DataTable table1 = new DataTable(); table1.ReadXml(путь);
- изменять/редактировать БД и таблицы.
- при необходимости сохранить.



Из всего написанного есть преимущества и недостатки у обоих видов БД.


Сравнение автономной(АБД) и реляционной(РБД) БД:
- для работы с АБД файл БД сохраненный на диске считывается полностью и дальнейшее обращение к диску не требуется, только по завершении программы. В РБД с файла БД на диске считываются только необходимые данные таблиц, обрабатываются и при необходимости (а необходимость в этом нередка) сохраняются. То есть для очень огромных баз данных АБД уступает РБД, оперативка не резиновая.
- для создания новых таблиц и столбцов в АБД не требуется знаний LINQ, в РБД - это обязательно.
- при создании новых столбцов в РБД данные в таблице стираются, в АБД.- нет.
- для работы с РБД требуется дополнительное стороннее ПО, для АБД - нет.


Вывод:
Для небольшой базы данных АБД имеет только плюсы.
При создании проекта использование АБД ускоряет процесс.
После финального создания проекта при необходимости можно перейти на РБД. Изменения в коде будут незначительными.
Если взять как образец игру Цивилизация, какой размер сохранки, а это и есть основная база данных игры, которая является самой большой базой (карта, игроки, юниты и т.д. и т.п.) ??? На самой большой карте размер сохранки не превышает 2 мегабайт. Допустим это заархивированный вариант и при загрузке происходит разархивирование и реальный размер в 10 раз больше. То есть 20 мегабайт. Пусть кто нибудь скажет мне ради чего стоит использовать РБД из за 20 мегабайт, или даже больших размеров - до 100 мегабайт?
Нынешние компы с оперативкой не менее 1 ГБ этого даже не почувствуют.


Не думаю что база данных создаваемой игры в финальной версии будет занимать больше 20 мегабайт. А выводы делайте сами, стоит ли заморачиваться из за 20 мегабайт над созданием реляционной РБД.

Почитать про АБД в книгах по шарпу. Все что касается DataSet

Предыдущее обсуждение этой темы.
Аватара пользователя
Snake_B
MOSC Team
Сообщения: 285
Регистрация: 25 янв 2011

Хранение данных в игре (2)

Сообщение Snake_B »

Денис хочет заслужить себе прозвище "убийца жестких дисков" что ле...
какие вообще разговоры могут быть про базу данных на жестком диске в игре...
если и доказывать преимущества АБД, то не сравнивая её с РБД, а сравнивая с тем, что реально можно использовать для хранения данных в игре...
Изображение
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Хранение данных в игре (2)

Сообщение Vasaka »

Snake_B писал(а): 04 янв 2012, 14:54Денис хочет заслужить себе прозвище "убийца жестких дисков" что ле...
какие вообще разговоры могут быть про базу данных на жестком диске в игре...
если и доказывать преимущества АБД, то не сравнивая её с РБД, а сравнивая с тем, что реально можно использовать для хранения данных в игре...


В предыдущей теме по хранению данный в игре, сравнивали эти два способа хранения, вероятно поэтому и приводилось сравнения этих БД.

Есть какие-то реальные альтернативы?
Огласите весь список пожалуйста.


P.S. И, конечно, огромное спасибо Денису за такой хороший ликбез! :ok3:
krupennikov
Сообщения: 53
Регистрация: 25 янв 2011

Хранение данных в игре (2)

Сообщение krupennikov »

Vasaka писал(а): 05 янв 2012, 01:01Есть какие-то реальные альтернативы?
Огласите весь список пожалуйста.

Конечно есть. (Но не совсем, почему? Ответ будет в самом конце.)
Это массивы и списки (List). А у кого нет практики с ними, приведу различие между массивами и списками, оно одно единственное:
- массивы всегда имеют фиксированный размер. Чтобы изменить размер, потребуется писать дополнительный код. Как то это напоминает один из минусов РБД. Списки не имеют фиксированного размера.

Получается, что мы сразу откидываем массивы, оставляем только списки.

Теперь перечислим, что нужно чтобы создать список объектов одного типа.
- создать класс, с описаниями всех свойств, полей и т.д.
- создать список этого класса, примерно так: List<MyObject> stars = new List<MyObject>();

Для изменения одного из объектов списка требуется:
- примерно так:
MyObject star = stars.Find(delegate(MyObject s) { return s.Name == "Вася"; });
star.Speed = star.Speed + 10;
...

Для сохранения списка в файл метода не существует, придется писать самим. То же самое и для загрузки из файла. Но это будет трудоемко и много заморочек. Но! Можно уменьшить трудоемкость и заморочки. Сделать небольшой код для переноса списка в таблицу типа DataTable, то есть в АБД. А у АБД есть готовый метод WriteXml. Точно также при загрузке переносить из АБД в список. Но возникает вопрос, зачем переносить из АБД в список, если можно напрямую работать с АБД?

Давайте сравним АБД и список.

АБД - создание:

Код: Выделить всё

DataTable starShips = new DataTable("StarShips");

stars.Columns.Add("Name");
stars.Columns.Add("Speed");
stars.Columns["Speed"].DataType = typeof(int);
stars.Columns.Add("Typ");

Список - создание:

Код: Выделить всё

class StarShips

{
public StarShips()
{
}
public string Name {get;set;}
public int Speed {get;set;}
public string Typ {get;set;}
}

class Program
{
List <StarShips> starShips = new List<StarShips>();
}


==================================

АБД - добавление:
DataRow starShip = starShips.NewRow();
starShip.Name = "Вася";
starShip.Speed = 100;
starShip.Typ = "Mk3";
starShips.Rows.Add(starShip);

Список - добавление:
StarShip starShip = new StarShip();
starShip.Name = "Вася";
starShip.Speed = 100;
starShip.Typ = "Mk3";
starShips.Add(starShip);

====================================

АБД - изменение:
string search= "Вася";
DataRow answer = starShips.Select("Name=" + search)[0];
answer["Name"] = "Петя";
answer["Speed"] = (int)answer["Speed"] + 10;

Список - изменение:
string search= "Вася";
StarShip answer = starShips.Find(delegate (StarShip s) { return s.Name == search; }
answer.Name = "Петя";
answer.Speed = answer.Speed + 10;

====================================

АБД - сохранение и загрузка
- уже обсуждалось.

Список - сохранение и загрузка
- пипец какой код... Причем при каждом изменении полей класса (смотрите Список-создание), редактируется и код

====================================

Есть еще одна разница. При использовании списков невозможно добавить новый "столбец" во время выполнения программы. Как и абсолютно новый тип объекта (например, если у кого то из программистов возникнет желание сделать конструктор чего то нового, типа чтобы игрок мог создать новый объект, несуществующий в игре, прям во время игры), так как списки построены на классах. Если вы заметили АБД не привязана ни к каким классам.

=====================================

Из всего вышесказанного у многих возникнет вопрос, почему из за незначительной разницы АБД и списка типа List, АБД относится к такому пугающему для начинающих программистов слову "База данных"? List - это массив с нефиксированной длиной, АБД - вроде тоже. Но! List - это массив объектов, у любого объекта могут быть методы. АБД - это массив данных. Например, рассмотрим тот же пример с кораблями List<StarShip>.
К вышеупомянутому классу (смотрите Список-создание) добавим метод движения корабля Go
public void Go(int x, int y)
{
...
}
Теперь к коду Список-изменение (смотрите выше) допишем такой код
answer.Go(100,120);
и он будет двигаться к соответствующим координатам.
Так вот в АБД мы не можем написать что то типа
answer.Go(...);
нам просто невозможно приписать методы к каждой строке в базе данных. База данных - это таблицы значений, а не массив объектов. Если для хранения данных использовать List, то в памяти за каждым starShip будут храниться еще и его методы, поля, свойства и т.д. плюс куча всякого добра, которое можно увидеть в студии при выполнении кода. С таким раскладом у вас оперативки точно не хватит. В базе данных если тип столбца указан как int, то каждая ячейка будет занимать в памяти именно 4 байта, ни больше ни меньше.
Само название темы говорит за себя "Хранение данных", а не хранение массива объектов.

На этом вроде все. Думаю вывод напишите сами, каждый свой.

PS: Нет времени для редактирования текста для более наглядного вида. Код в тексте в студии не проверял, могут быть опечатки
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Хранение данных в игре (2)

Сообщение Vasaka »

Спасибо Денис!
Очень ценная информация. По крайней мере для меня. :cool:
Закрыто