Страница 3 из 6

Хранение данных в игре

Добавлено: 28 ноя 2011, 17:40
AndreyKl
Статью можно подправить в соответсвии ентити 4.1/4.2 :).
Разумеется Entity никогда не будет эффективней чистых запросов SQL, но тут вкрадывается одно большое но - это справедливо если программист великолепно ориентируется в работе с БД, тобишь знает как эффективно строить запросы и использовать их. Энтити с комплектом из Linq не только на порядок упрощает работу лишая нас необходимости писать несколько десятков запросов на таблицу, парсить и объединять строки из частей запросов если требуется создавать варианты, но еще и старается оптимизировать сами запросы, урезать до минимума обращения к БД и тп. Для программиста класс контейнер ентити на первый взгляд ни чем не отличается от набора каких нибудь List. По сути, это и есть набор перечисляемых массивов с десятком дополнительных методов (кажется на основе патерна AbstractFactory).

К сожалению литературы у меня нет, мне просто сказали сесть и делать, я сел, создал генератором по БД обьект из ентити, как следствие - забыл про существование БД в проекте до трабла с рефреш. Единственная используемая литература - msdn и он же по кнопке f1 в компиляторе.
На мсдн ссылки и даю (на русском): http://msdn.microsoft.com/ru-ru/library/bb399596.aspx

Хранение данных в игре

Добавлено: 04 дек 2011, 09:43
krupennikov
Андрей, если будет время, сделай пример на ентити, в котором будет создаваться БД кодом, добавляться столбцы в существующую таблицу без потери данных. Ну что то на подобие моего примера на DataTable. Уж очень сжатая инфа по ентити

Хранение данных в игре

Добавлено: 04 дек 2011, 20:43
AndreyKl
Чтобы создать БД в сервере к которому подключен, достаточно вызвать CreateDatabase(). Функция выполнит SQl код сгенерированный вашей моделью. Редактировать диаграмму с таблицами можно вручную или через какойнить Menedgment Studio, в коде это делать не к чему.

Редактировать БД в процессе работы мне еще не приходилось даже для построения имитационной модели сети (пришлось создавать кастомные поля в процессе работы, множественные таблицы маршрутизации для различных протоколов, формировать разные виды метрик для каждого маршрута, число метрик увеличивалось), поэтому привести пример не могу (в частности в академии где учился бьют по рукам за редактирование таблиц и связей из кода называя это некрасивым подходом). Полагаю, что это возможно, во всяком случае видел, как ObjectSet созданный вне ентиты закатывали в БД без использования запросов, кажется через функции ентити AddObject и CreateEntityId (или что-то в этом духе). Однако на 100% уверен, что в приделах игры это не нужно - львиная доля программ работает с БД а не редактирует их структуру (известные мне исключения: 1C, Visual Studio, другие средства разработки и админские утилиты). Если считаете, что редактирование структуры необходимо, приведите пример, я попробую доказать, что его можно реализовать не прибегая к ресурсо-ёмким задачам редактирования структуры БД.
Все поля таблицы можно а) предусмотреть заранее в качестве nulleble б) создать несколько кастомных полей для данных плюс поле/поля/таблицу описания в которые и загонять якобы динамически добавленные названия полей (не самый красивый метод). К примеру так сделали в некоторых устаревших справочных системах, где пользователи добавляют собственные поля к контактам. в) создать вторую таблицу для хранения названий полей, третью с указанием на id элементов первой и в неё загонять значения. Так делают в современных справочных системах, если пользователь вдруг хочет указать в контакте логин друга в Google+, на который программа не расчитана. Пользователь якобы создает новое поле с соответсвующим именем и значением, на самом деле в сопровождающей таблице появляется одна единственная запись id,контакт, ид поля, Login в системе Google+, ну и соответственно в таблице полей Google+ с идишником (разумеется первым создается поле).
Преимущество всех трех вариантов перед динамическим редактирование структуры БД в простоте разработки и быстродействии. Вариант А самый эффективный по скорости формирования выборок, вариант Б позволяет формировать реально произвольные поля, хотя и в ограниченном колличестве, вариант В самый экономный по памяти, но самый медленный по формирования выборок (на практике разница от А не видна).

Для сейвов игры структура гарантированно не будет меняться, если же по какой-то причине возникла необходимость создать таблицу прямо в коде, выполняем запрос Linq и получаем нужную таблицу не загоняя её в БД либо используем new {}, создаем коллекцию по неименованному классу/кастомному objectSet или еще чему нибудь. Загонять сгенеренные временные таблицы в БД безсмысленно, всеравно удалять потом либо можно восстановить по уже существующим данным, а повторные запросы как к ObjectSet, так и классам Linq выполняются без проблем.

Хранение данных в игре

Добавлено: 04 дек 2011, 23:12
Scampada
Классы сущностей, насколько понимаю, еще не созданы? Пока обсуждается реализация работы с БД. Но хотя бы прикидки уже есть какие-то? Я со своим абсолютным отсутствием опыта мог бы хотя бы классы описать и загнать в dll'ки. :-D

Хранение данных в игре

Добавлено: 05 дек 2011, 00:04
krupennikov
Доказывать или недоказывать о какой нибудь необходимости... Причем тут это? Я не смог реализовать это в своем проекте, поэтому и спросил. Я в коде даже не смог создать БД и редактировать ее в коде... А также делать запросы. Уж слишком сложно изучать ентити при отсутствии толковых и простых примеров с объяснениями на русском. Можешь простой пример на 2 связанные таблицы сделать? А именно показать создание БД, создание таблиц в БД, запросы на изменение ячеек, добавление и удаление строк. Желательно на WindowsForm, с WPF не дружу

Хранение данных в игре

Добавлено: 05 дек 2011, 13:37
AndreyKl
Scampada писал(а): 04 дек 2011, 23:12Классы сущностей, насколько понимаю, еще не созданы? Пока обсуждается реализация работы с БД. Но хотя бы прикидки уже есть какие-то? Я со своим абсолютным отсутствием опыта мог бы хотя бы классы описать и загнать в dll'ки. :-D

Преимущество Entity в том, что классы создавать не нужно, вы на диаграмме (типа UML, файл edmx в студии) рисуте вашу БД (её таблицы, связи, поля), жмете map database, на выходе получаете класс для работы с БД, который при подключении к серверу одной командой создаст её и её таблицы. Работаете с БД так, бодто это какой-то набор List.

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

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

Хранение данных в игре

Добавлено: 08 дек 2011, 21:58
Vasaka
Вышел на связь наш капитан дальнего плавания. Говорит, что скоро выложит новую версию. Просил меня вас спросить:
Пробовал ли кто-то уже работать с БД из Юнити, и если пробовали, то просит объяснить как и что, и с примерами. Ему это надо для дальнейшей работы над игрой.
Юнити похоже использует .НЕТ 2.0

Хранение данных в игре

Добавлено: 09 дек 2011, 13:01
AndreyKl
Тобишь весь диалог по БД из фреймворка 4.0 никому не нужен((

Уточни необходимую БД - методы доступа могут немного различатся.
Подключение к mySQL из Unity pdf
В целом для MySQL общая структура стандартна - создается класс подключения MySqlConnection, в него загоняется строка подключения, создается класс комманд MySqlCommand, в него загоняется запрос к БД и класс подключения к БД. результат выводить в MySqlDataReader, для ошибок MySqlError. В общем до этого момента никаких отличий от других БД.
Вот механизм добавления параметров на мой взгляд не стандартный или я просто подзабыл уже обычные БД, мне кажется, что составлять строку запроса самому проще, чем предложенным классом MySqlParameter

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



using (var con = new MySqlConnection(constr))
{
using (var cmd = new MySqlCommand("Select * from table1", con))
{
MySqlDataReader rdr=cmd.ExecuteReader();
while (rdr.Read())
{
var itemID = rdr["ID"].ToString(); //необходимо распарсить в сроку, потом можно и в int, как в примере далее
var posx = float.Parse(rdr["posx"].ToString());
var posy = float.Parse(rdr["posy"].ToString());
//обработка
}
rdr.Dispose();
}
using (var cmd2 = new MySqlCommand("Delete from table1 where id==2", con))
{
cmd2.ExecuteNonQuery();
}
}

Хранение данных в игре

Добавлено: 09 дек 2011, 14:12
Slimper
AndreyKl писал(а): 09 дек 2011, 13:01код, по непонятным причинам source опять не сработал

Причина проста, "с" в русской и английской раскладки разные буквы, хотя внешне и не отличаются, недавно для C# сделал специальную клавишу Изображение

Хранение данных в игре

Добавлено: 09 дек 2011, 14:23
Vasaka
AndreyKl писал(а): 09 дек 2011, 13:01Тобишь весь диалог по БД из фреймворка 4.0 никому не нужен((

Ну, мне-то было очень интересно послушать. Мне точно нужен был.

Я не знаю точно на чём работает Юнити. Витя сказал, что использует .NET 2.0, а Диман проверял работу готовой сборки на ХР без фреймворка. Всё работало.
Точной информации я по этому не смог найти.


AndreyKl писал(а): 09 дек 2011, 13:01Уточни необходимую БД - методы доступа могут немного различатся.

Не знаю. :pardon: Я и слушал ваш разговор с интересом потому, что пытался понять и определить что лучше и как делать. Но у меня явно мало навыков программирования и опыта, чтобы решить какие технологии использовать для этого.
Тут должен решать ведущий программист.
Ждём Витю, что он скажет.

Теперь есть специальная кнопка для кода C#