Було б краще використовувати XML / JSON / Text або базу даних для зберігання контенту гри?


29

Я розглядаю, як реалізувати гру на основі компонентів, оскільки це здається гарячою справою, і мені подобається ідея такого гнучкого дизайну. Однією з особливостей такого дизайну є те, що додавання нових речей в гру може здійснюватися за допомогою даних, часто представлених як завантаження вмісту за допомогою текстових файлів, таких як XML. Це має перевагу в тому, що людина читається і легко редагується в будь-якому текстовому редакторі. З іншого боку, з текстом можна працювати повільніше, і вам доведеться керувати великою колекцією файлів даних. Подібні текстові формати, такі як JSON або конфігураційні файли, мали б подібні переваги.

З іншого боку, є невеликі портативні бази даних, такі як SQLite або Tokyo Cabinet. Хоча ці файли не читаються безпосередньо людиною, з цими файлами легко поєднуватись, і я думаю, якийсь інструмент редагування в будь-якому випадку буде кращим для дизайну контенту ігор. Використання БД дозволяє послідовно зберігати інформацію конфігурації та легко отримувати. Ви можете серіалізувати дані в БД для збереження ігор.

Я думаю, що ефективність XML, як правило, швидша для невеликих файлів, але база даних краще масштабує великі обсяги даних. Я думаю, у будь-якій реальній грі буде багато ігрових об'єктів.

Отже, питання: який є кращим підхід? Я схиляюся до БД, але хочу знати, чи є приховані підводні камені чи справжні сильні переваги текстових файлів. Або якщо є інші альтернативи, крім них (я думаю, серіалізувати у двійковий формат?)

Відповіді:


18

Можливо, для маленької особистої гри це не так придумає, але одна з важких проблем, що стосується даних ігор, - це багатокористувацьке редагування / редагування версій. Ми використовуємо безліч невеликих текстових файлів, які в процесі збирання зменшуються до невеликої кількості двійкових крапок. Це полегшує життя дизайнерам, оскільки вони мають велику гнучкість у своєму робочому процесі. CCP, як зустрічний приклад, використовує центральну базу даних для редагування, до якої підключаються всі дизайнери. Це робить крок збирання непотрібним (або, принаймні, набагато простішим), але це означає, що вам потрібно реалізувати всі функції версій та робочого процесу самостійно, тому вони, мабуть, будуть простішими, ніж інші інструменти там. Ви можете мати справу з продуктивністю в будь-якому випадку, тому справжнє питання полягає в тому, що вам потрібно для дизайнерського робочого процесу та як ви можете туди дістатися?


Це відмінний момент. Я не розглядав робочий процес для кількох людей занадто уважно, а також контроль версій. Це обидва дуже гарні аргументи на користь текстових файлів, принаймні як вихідний документ. Простіша підтримка інструментів. Дякую за таку перспективу!
CodexArcanum

Експортувати базу даних у XML досить просто. Маючи лише невелике планування вперед, ви можете записати завантажувач компонентів у якості інтерфейсу - тоді просто підключіть або зчитувач баз даних, або зчитувач файлів XML. Під час створення компонентів база даних може бути простішою, оскільки є готові графічні інтерфейси для всіх маніпуляцій з даними проти редагування кількох файлів. Потім, в остаточному процесі збирання, просто збережіть базу даних у форматі XML, скопіюйте у двійкові тощо, а у виробничій версії гри просто використовується відповідний завантажувач.
Звільнення

1
Як би це допомогло? Використання користувальницького редактора, а потім виведення текстових файлів насправді дає найгірші частини кожної опції :-P
кодерангер

7

JSON дуже легкий і зрозумілий. Я думаю, що це краще підходить для гри. cJSON - це справді приємно. він також буде включений у ваш джерело так само, як це робить SQLlite.

Користувачі важче редагувати XML-файли, ніж ви думаєте. якщо ви йдете цим маршрутом, можливо, ви захочете зробити редактор для людей, щоб допомогти їм уникнути загальних підводних каменів.


Я дійсно ніколи не дивився на JSON так сильно, як я був задоволений XML (Наскільки простіше це може бути насправді). дані важкі
Spooks

7

Я запізнююсь на вечірку тут, але я витратив багато часу на дослідження цього.

По-перше, чому я не використовую наступне:

XML: надмірно багатослівний. Тон надмірності. Повторення імен полів? ВАРОТИЙ

JSON: Я думаю, що JSON чудово підходить для макета інтерфейсу, але для бази даних, пекло ні. У нього будуть ті ж проблеми, що і XML, надмірність та глибоке вкладання. ВАРОТИЙ.

SQL : Це чудовий варіант, якщо ви керуєте головними болями від його налаштування. Я створив мобільні ігри, де ми зберігаємо дані гри в Інтернеті в базі даних SQL. Формат таблиці приємний. Проблема полягала в тому, що нам довелося взяти базу даних в Інтернеті та встановити, що налаштування може бути клопотом. Але SQL - гідне рішення. Unity не підтримує це споконвічно, і плагіни, які я випробував, мали серйозні проблеми (особливо, коли намагалися змусити його працювати з контролем версій).

Нарешті, ось рішення, яке я обрав (і мені це подобається).

CSV : Простий. Дозволяє мені використовувати формат таблиці, і я маю одну просту точку відліку, коли мені потрібно оновити його. У мене може бути таблиця для всієї моєї зброї, стовпці для всіх атрибутів і рядки для кожного типу зброї.

Ви можете використовувати Microsoft Excel, але вони виписують ці дурні попередження щоразу, коли вам потрібно зберегти. Ви можете використовувати макроси, щоб їх перекрити, але я кажу, врятуйте собі проблеми і отримайте LibreOffice . Він безкоштовний, підтримує редагування CSV, і коли ви відкриваєте файл, він завантажує ширину стовпця, щоб відповідати імені (Excel не робить цього, і це запустило мене на гайки).

Тоді вам просто потрібно розібрати файли CSV у вашій грі. Я використовую Unity, тому все, що я повинен був зробити, це використовувати цей чудовий синтаксичний аналізатор C # CSV:

Приклад аналізатора CSV

Ви перетворюєте файли CSV у ваші об’єкти даних ігор, і ви готові йти. За допомогою Unity ви можете перетворити їх на ScriptableObjects . Отже, мій робочий процес: Оновлення CSV -> Розбір CSV на об'єкти, які можна писати на скрипті -> Використовувати дані для ScriptableObjects для моєї гри


6

Відповідь на це залежить від того, яку мову ви використовуєте для гри.

Якщо ви використовуєте C ++, вам рекомендується використовувати одну з існуючих бібліотек XML (наприклад, TinyXml або eXpat ).

З іншого боку, якби ви використовували PHP, ви могли б дуже легко використовувати сервер баз даних, такий як MySQL або SQLite. (Майте на увазі, що якщо ви підете цим маршрутом, вам знадобиться більше ресурсів, оскільки сервер баз даних буде працювати як окремий процес, а більші додатки бази даних, такі як MySQL, можуть споживати багато оперативної пам’яті при запуску.)

JSON набирає чимало обертів і, безумовно, найкращий вибір, якщо ваша заявка написана більш ніж однією мовою.

Коротше кажучи, це залежить від того, що легко можна використовувати у вашій мові.


1
Яка проблема використовувати будь-яку БД з C ++?
Будда

2

Якщо ви хочете залишитися у царині речей XML, ви можете використовувати Binary XML, щоб підвищити ефективність завантаження.

Наприклад, Fast Infoset - це реалізація бінарного xml

Швидкий інформаційний набір можна вважати gzip для XML, хоча FI спрямований на оптимізацію як розміру документа, так і продуктивності обробки, тоді як gzip оптимізує лише розмір. Поки початкове форматування втрачається, при перетворенні з XML у FI та назад у XML не втрачається жодна інформація.


Хоча, ймовірно, не те, що я б використовував (я схиляюся до JSON над XML), але я ціную посилання.
CodexArcanum

1

Я вже протягом багатьох років розробляю бази даних і розігрую багато ідей. Наразі мій особистий фаворит - це якийсь текстовий, читаний для людини формат для конфігурацій, але потім розбір цих "повільних сценаріїв" на щось більш зручне. Так само, як JAVA і .NET компілюється в байт-код запущеного часу.

Тут іде ідея. У мене є "вихідна" версія компонентів, і тоді попередній компілятор / аналізатор проходить через них. Якщо вони займають занадто багато пам’яті, ви можете помістити їх у швидку SQL-дату деякого роду або зберегти їх у вигляді бінарних файлів. Але моя думка полягає в тому, щоб використовувати пам'ять або SQL-базу даних як робочу область / кеш, щоб вам не довелося розбирати сценарії знову і знову. Ви можете зробити компілятор, перемістити розібрані файли у "джерело-ліб", і таким чином дозволити прекомпілятору теж робити версію (зберігаючи попередні файли для відкату).

Якщо мова йде про "необмежений простір жорсткого диска", тоді підпишіться на щось на зразок Dropbox або Amazon S3 і синхронізуйте з ними.

Тож план для мене зараз:

  1. Налаштування / скриптів / xml (деякий читабельний для людини формат) у вигляді текстових файлів (подібно до вихідного коду)
  2. Парсер / валідатор, який працює через нові сценарії та перевіряє, чи відповідають вони правилам
  3. Компілятор, який робить двійкові чи SQL-рядки з вихідних файлів, так що вони швидко повертаються + швидко запускаються.

Щодо стабільності, я наразі будую базу даних, щоб вона розміщувалася як "локальне розміщення", і автосинхронізувалася між декількома місцями, так що якщо в одному з локальних / апаратних збоїв є одна локація, інші сайти повинні мати змогу обробляти той же трафік / ігор.


Цікаве рішення, особливо зважаючи на те, скільки хмарного хостингу процвітало з часу написання вашої відповіді.
rideoutcolin

1

Якщо ви використовуєте couchdb, ви по суті збережете все як структуру JSON. Couchdb подбає про те, щоб більш-менш безболісно копіювати дані вашого (декількох) користувачів.


0

Ви можете знайти процедуру в Unity Wiki за допомогою PHP, MySQL та C # / JavaScript, і вона чудово працює за своїм призначенням.

Він складається з трьох етапів

  1. Створіть порожню базу даних MySQL та таблицю.
  2. Створіть сторонній скрипт сервера PHP (Це підключиться до таблиці MySQL, отримає дані із скрипту Unity (крок 3) та запитає до бази даних (наведені приклади - це або вставлення даних, або вибір))
  3. Створіть скрипт контролера Unity (Це підключиться до сценарію PHP, створеного на кроці 2)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.