Чому погано вміст жорсткого коду?


41

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

Я можу подумати з кількох причин, але яка головна причина, чому навіть текстові ігри зберігають все у файлах поза програмою?

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

Деякі ігри навіть містять графіку (ASCII art?) Всередині коду. Я знаю, що це неправильно, і я можу здогадатися про декілька причин, чому це погано, але не знаю головної причини, чому також.

Дуже популярно мати більшу частину вмісту поза програмою. Навіть фортеця-карлик не використовує фактичних символів ASCII, а зображення символів ASCII, завантажених у пам'ять.

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


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

7
i18n було б дуже важко зробити із вмістом, вбудованим у джерело.
pllee

5
Не дуже впевнений, що це специфічна розробка гри. Надалі розглянемо запитання у програмістів SE або stackoverflow.
MichaelHouse

13
just making every unique dungeon (content) its own class.Це просто змусило мене тремтіти. Відокремлення даних від логіки є для мене таким фундаментальним принципом, що я дивуюсь, що розробники все ще порушують це.
Ліліенталь

4
Що б ви не вирішили, майте на увазі, що вміст жорсткого кодування передбачає набагато більше особливих випадків. Хочете, щоб певний начальник з’явився лише між опівночі та 7 ранку (у режимі реального часу)? Це набагато простіше зробити жорсткий код, ніж створити загальний спосіб появи монстрів лише в певний час.
користувач253751

Відповіді:


85

Для цього є кілька причин. Я просто торкнусь декількох:

  1. Це робить ваш вихідний код безладом. Якщо у вас багато діалогів (дерев), величезна частина вашої кодової бази - це лише текст, який не має нічого спільного з вашим фактичним кодом гри.
  2. Вам потрібно буде перекомпілювати кожного разу, коли ви зміните стільки, скільки одного символу.
  3. У самому діалозі важко орієнтуватися. Я думаю, що намагання реалізувати ціле діалогове дерево, не кажучи вже про кілька, повністю всередині вашого джерела призведе до вкладеного безладу спагетті та вкладених ifs, switches тощо. Потім це призводить до коду, схильного до помилок, важкого для читання та складнішого налагодження.
  4. Якщо ви хочете дозволити людям модифікувати або розширити вашу гру, це набагато простіше, якщо їм не доведеться мати справу з вихідним кодом, щоб щось змінити.
  5. Вищезазначений момент ще важливіший, якщо ви працюєте в команді. Ви не хочете, щоб вашому письменнику доводилося возитися з кодом просто для того, щоб ввести фрагмент діалогу.
  6. Розбір XML або інших стандартних форматів файлів зробити досить просто, якщо ви використовуєте існуючі бібліотеки, тому вартість його реалізації таким чином дуже низька, при цьому ви отримуєте безліч переваг і уникаєте проблем, зазначених вище, та багато іншого.
  7. Як зазначено нижче @MiloPrice, локалізувати гру також набагато простіше, якщо ваш текст знаходиться у зовнішніх файлах. Ви можете додати мову, додавши файл, ваша команда може подбати про переклад, не торкаючись джерела (що особливо важливо, якщо ви дозволяєте людям перекладати, хто не повинен бачити весь ваш код - подумайте, фрілансери, люди з спільнота, яка не належить до вашої команди тощо).

10
Я б не сказав, що це зробить ваш код безладним. В іншому випадку, вміст чи ні, що завгодно, можна вважати безладною масою. Ви можете структурувати вміст у гарній структурі так само, як код. Але решта пунктів все ще сильні.
Глен Лебедь

28
Простота локалізації / перекладу - ще одна велика перевага.
Міло П

2
@Christian: Ви можете мати керовану даними програму, де дані вбудовуються в програму у форматі, де вони безпосередньо використовуються на місці (наприклад, у C або C ++, великі, сподіваємось, constмасиви зі статичною тривалістю зберігання). Це заощаджує весь код та вартість пам’яті під час завантаження / перетворення зовнішнього представлення даних під час виконання. Звичайно, всі ваші інші причини збереження даних зовнішніми все ще застосовуються.
R ..

2
Особисто я віддаю перевагу ще сильнішому підходу з тих самих причин, які перераховані тут: Перемістіть також більшу частину коду і мовою сценарію. Побудуйте ядро ​​в C / C ++, вставте мову на зразок Python або Lua та експортуйте до неї API. Don't Starveдотримується такого підходу, і це одна з найкраще написаних ігор, які я бачив. Численні інші ігри в минулому і теперішньому також роблять це, як і додатки (а рідше - утиліти). Я б сказав, що загалом, за межами невеликих проектів та крихітних комунальних послуг, важкий розклад та розлука завжди є вашим другом.
mechalynx


30

Внесення даних про вміст гри в код означає, що щоб побачити будь-яку можливу зміну або ітерацію даних про вміст гри, вам доведеться перекомпілювати саму гру. Це погано з двох причин:

  • Багато мов, на яких написані ігри, давно складають. C ++, зокрема, може бути дуже поганим у цьому відношенні, а C ++ - дуже поширена мова для великих комерційних ігор. Це менше проблеми з такими мовами, як C # та Java, але все ж не настільки швидко, як можливість зберігати дані про ігри у зовнішніх файлах, які можна перезавантажити, поки гра насправді працює, щоб побачити зміни.

  • Багато ігор розробляються командами, які часто складаються з нетехнічних розробників (дизайнерів та художників), що виробляють контент. Мало того, що нетехнічним людям не хочеться перекомпілювати гру або мати справу з "громіздкими інструментами програміста", щоб повторити їх вміст, можливо, бажано мінімізувати експозицію вихідного коду лише для програмістів (адже менше людей, які мають доступ до вихідного коду, тим менше людей, які можуть його просочити - випадково чи ні).

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

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

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


Я не думаю, що час компіляції насправді не так важливий, але, як розробник, ми завжди прагнемо до "акуратного коду" ... це досить вагома причина для того, щоб розділяти речі власноруч ... вміст має бути вмістом, а не кодом!
Війна

4
@ Wardy Час компіляції дійсно важливий для C ++. Я працював з рішеннями, на створення яких пішло більше 15 хвилин, або через розмір проекту, агресивне використання шаблонів або навіть лінь розробника (включаючи непотрібні заголовки). І я впевнений, що це стосується величезних комерційних ігор.
concept3d

1
@ concept3d: Я хочу, щоб мій проект пройшов 15 хвилин. Чиста збірка на виділеному сервері збірки займає ~ 50 хвилин.
Mooing Duck

чим менше людей, які мають доступ до вихідного коду, тим менше людей, які будуть страждати від пошкодження мозку, яке викликає C ++. : P
Sarge Borsch

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

7

Як завжди, як завжди, це залежить. Але спершу хотілося б стверджувати, що жорстке кодування само по собі не є поганим.

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

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

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

Однак прорисування межі між програмою та змістом не завжди справді тривіально. Можна сказати, що текстури мають 100% вміст; а як щодо процедурно створених текстур? Текст діалогу можна вважати вмістом 100%; а як бути, коли діалогове вікно змінюється залежно від попередніх дій? Інші елементи, які можна вважати на 100% частиною програми, як скрипти або шейдери, також можуть вважатися частиною вмісту гри. Чи повинні вони бути жорстко кодованими? чи слід їх завантажувати як зовнішній ресурс?

Пам’ятайте, що кожен тип вмісту, який ви підтримуєте у своїй грі, повинен мати код завантаження та інтерпретації, пов'язаний із цим, тому, як правило, якщо ви сумніваєтесь, я б рекомендував жорстке кодування вмісту та виносив його лише на зовнішній ресурс, коли ви справді потрібна ця гнучкість (не тоді, коли ти думаєш, що тобі потрібна, а коли ти насправді робиш)

Нарешті, однією з переваг зберігання даних у файлах ресурсів є те, що ви можете завантажувати їх лише тоді, коли вони вам потрібні (отже, можливо, пришвидшити час завантаження гри) та вивантажити їх, коли вони вам більше не потрібні (тому дозволяєте мати більше вмісту ніж може вміститися в пам'яті). (Куточок Nitpickers: DLL-ресурси ресурсів, можливо, можна вважати зовнішніми ресурсами)


7
"Але пам’ятайте, що кожен шар абстракції, який ви робите, зробить вашу програму складнішою і складнішою для розуміння." Мені б не погодитися, абстракція може зробити програму більш простою і, звичайно, повинна полегшити її розуміння.
NPSF3000

1
@ NPSF3000 абстракцій буде додати складність, але може видалити більшу складність , ніж вони додають.
користувач253751

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

3
@ NPSF3000: Думаю, що ви не повинні створювати абстракції лише тому, що можете. Іноді дані жорсткого кодування простіші, зрозуміліші та простіші навколо. Частіше за все я бачив, як ігри спускаються по шляху програмного кодування , про що я шкодую . Також майте на увазі, що додавати абстракції завжди простіше, ніж видаляти їх, тому я твердий прихильник додавання абстракцій лише тоді, коли вони вам потрібні.
Піжама Panda

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

3

Великою причиною зберігання в текстових файлах є повторне використання. Створення рамки текстової гри, яка читає ваші карти, діалогове вікно та інші ресурси з текстового файлу, дозволяють повторно використовувати рамки для інших ігор. Якщо вийти за рамки текстових ігор, так великі бюджетні назви, як Call of Duty, щорічно випускають нову гру.

Ще одна причина - портативність. Ви можете використовувати ті самі файли для Інтернету, ПК, Mac, Android і т.д.

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


1
Звичайно, наявність більшості речей для багаторазового використання, як правило, змушує вас уникати чогось «особливого», поза правилами, які у вас вже є. Я точно не виступаю за жорстке кодування великих ігор, але це надзвичайно корисно, коли ви розробляєте прототипи чи пишете експериментальні ігри - це дає вам набагато більше гнучкості. Звичайно, це має на меті ціну, тому зазвичай корисно переробляти все, як тільки геймплей насправді працює. Ігровий процес - найважливіша частина - переконайтеся, що ви можете протестувати його без дайвінгу через архітектурне пекло: D Зазвичай, простіше знайти загальну форму після отримання конкрементів.
Луань

3

Задля швидшого внесення змін це прискорює розвиток на великих виробництвах тоннами.

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


3

Я не можу повірити, що ніхто ще не згадав про це, але велика причина - зробити локалізацію ЛОГО простішою. Якщо вам потрібно підтримувати англійську, французьку, німецьку, іспанську, португальську, італійську, російську, китайську та будь-яку іншу мову, на яку ви прагнете, жорстке кодування вимагає, щоб ви мали окремий код для кожної мови. Це також означає, що якщо вам потрібно видалити певний вміст (читайте: цензура), вам потрібно змінити свій код, щоб уникнути цього, замість того, щоб сказати «просто замініть цю анальну міні-програму з зондуванням на цей пасивно-агресивний банер, який графічно пояснює, що відбувається ". Це також досить недоброзичливо для споживачів, оскільки, ймовірно, їм знадобиться перезапустити гру, щоб змінити мову, оскільки вам потрібно завантажити інші бібліотеки. Нарешті,

З іншого боку, якщо ви використовуєте зовнішні ресурси, підтримка різних мов означає лише завантаження іншого файлу ресурсів. Це можна легко зробити під час гри. це означає, що ви можете мати єдину базу коду, що значно спрощує розробку. А це також означає, що ви можете легко додати підтримку після випуску інших мов. Нарешті, це означає, що ви можете дозволити користувачеві відмовлятися від встановлення певних мов (функція, яка трапляється не так часто, як в іграх, але така, яка все ще можлива), щоб заощадити дисковий простір та пропускну здатність.


3

Я думаю, що ключовою фразою є розділення проблем .

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

Йому не потрібно думати про локалізацію. Людині, яка здійснює локалізацію, не потрібно турбуватися про код.


3

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

Чому? Оскільки тут є вибір, який полягає у врівноваженні вартості / питань / переваг кожного рішення.

При використанні зовнішнього файлу ... Ну, мабуть, інші відповіді досить добре пояснюють переваги. А як щодо витрат? Ви повинні визначити дійсний формалізм, побудувати інтерпретатора, домовитись про формат файлу та ще гірше ... побудувати інший додаток - редактор-. Що становить 0,00%, якщо ви є членом команди, що розробляє 50 великих кодерів. Але якщо ти один: ти затримався.

Знову ж таки, я не недооцінюю величезні переваги гнучкості зовнішнього ресурсу: програмування, кероване даними, мені здається дорогою для відеоігор. Але не будемо забувати про вартість.

З іншого боку, наявність тексту всередині коду дозволяє швидко формувати прототипи, тому слід віддавати перевагу в перший раз. Тоді в міру дозрівання моєї поради було б проаналізувати вид даних, необхідних для моделювання діалогів (настрій / історія-стан / ...). Тоді в якийсь момент ви вирішуєте деякі класи / правила / формат файлу і переходите до справжньої речі, дозволяючи іншим людям редагувати / від’єднувати код від вмісту тощо. АБО для гри з простими діалогами (Mario ...) ви просто вважаєте вартість занадто високою, і ви зберігаєте кілька рядків / поведінки жорстко кодованими.
Твій дзвінок.

(Зауважте про локалізацію: це просто хеш-таблиця, тому це незалежна та легко вирішувана проблема.)


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

1
Звичайно: можливо, я був недостатньо зрозумілий, я мав на увазі, що лише після декількох ітерацій ви дізнаєтеся, яка форма ваших діалогів (від простої прямої лінії до складного дерева або стан машини). На перших кроках декілька (найпростіших) ifs + деяка жорстко закодована рядок - це нормально. Тоді, коли ви зможете чітко передбачити свої потреби, зробіть вибір, оцінивши вартість / вигоди кожного рішення.
GameAlchemist

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

2

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

Наприклад,

  • Ваш код може бути FLOSS , але ви взагалі не хочете ліцензувати свій вміст (можливо, ви хочете опублікувати свій ігровий код, щоб інші могли використовувати його для створення подібних ігор з різним вмістом)
  • у вашому коді може бути FLOSS, але ви хочете використовувати ліцензію Creative Commons для свого вмісту (оскільки ліцензії на програмне забезпечення не дуже корисні для вмісту і навпаки)
  • Ваш код може бути власником , але ви повторно використовуєте безкоштовний вміст
  • Ваш код може бути власником, але ви хочете публікувати власний вміст за ліцензією вільної / вільної
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.