Должны ли инструменты конвейера контента быть встроены в движок?

10

Насколько минимальным должен быть игровой движок? Какая часть конвейера контента должна быть встроена в движок?

Некоторые случаи использования, где может быть полезен супер движок:

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

  • Скрипт запрашивает шрифт гораздо большего размера, чем был предварительно сгенерирован, движок может проанализировать файл ttf и создать новый атлас текстур.

  • Halo Forge .

Ничто из этого не бесплатно конечно. Это требует, чтобы ваши инструменты конвейера контента были написаны на C ++. Библиотеки поддержки, которые вы используете в конвейере, должны быть скомпилированы для использования на устройстве. Это требует генерации контента, чтобы не глючить. И это обычно делает ваш двигатель больше и громоздким.
Какие еще плюсы и минусы?
Перевешивают ли плюсы минусы?

Некоторые конкретные вопросы:

  • Должен ли движок загружать различные форматы изображений? Загрузчик только TGA довольно прост в написании кода.

  • Как насчет аудио форматов? Возможно ли поддерживать только загрузку файлов WAV? Как насчет фоновых музыкальных файлов, которые часто бывают огромными.

  • Должен ли двигатель быть в состоянии динамически разбирать TTF и генерировать атлас?

  • Упаковка текстур.

deft_code
источник

Ответы:

11

Блог Ноэля Ллописа «Игры изнутри» затронул эту тему недавно в посте «Удаленное редактирование игр» . Первый абзац:

Я давно был поклонником минимального времени выполнения игр. Все, что может быть сделано в автономном режиме или в отдельном инструменте, должно быть вне времени выполнения. Это делает игровую архитектуру и код очень простыми и понятными .

(Очень рекомендуется прочитать статью, как и большинство материалов Ноэля, согласны ли вы на 100% или нет.)

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

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

Принятие некоторых принципов « философии Unix » поможет вам сохранить гибкость вашей цепочки инструментов: небольшой модульный конвейер.

Моя личная философия: выпекать как можно больше данных в автономном режиме, но обеспечить поддержку движка для получения новых запеченных данных в любое время. (Обратите внимание, что эти новые данные не нужно вводить в игру, пока не появится удобная точка: кнопка «обновить» нажата, начинается следующий уровень, вы переходите в новую область, что угодно. Ключ находится в том месте, которое минимизирует время итерации с минимальной сложностью кода и усилиями по кодированию.)

В нашей компании большинство инструментов, предназначенных для художников / дизайнеров, сосредоточены на вопросах пользовательского интерфейса: простоте манипулирования отдельными активами или их партиями и т. Д. Иногда они являются инструментами сторонних производителей, такими как Photoshop или 3DS Max. Эти инструменты экспортируют в промежуточный формат (часто xml, который ссылается на двоичные данные источника, но не всегда). Промежуточный формат выбирается внутренним инструментом «создания данных», который превращает его в нечто полезное и быстро загружаемое для целевой платформы.

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

Теперь, при правильном создании добавочных данных, вы можете вносить изменения в запеченный формат в течение нескольких секунд; ваш двигатель может «паучить» или инструмент может «паучить», и тогда они появятся в вашей системе ресурсов, готовые к перезагрузке, когда это будет удобно.

Инструменты - особенно инструменты создания внутренних данных - часто работают медленнее и медленнее, чем код движка. Это нормально, потому что их проще реорганизовать / переписать, расширить и протестировать; у вас есть спецификации для их поведения, и их довольно легко протестировать по сравнению с некоторым кодом двигателя.

Мои мнения по вашим вопросам:

Должен ли движок загружать различные форматы изображений? Загрузчик только TGA довольно прост в написании кода.

(Кроме того: даже если вы используете встроенный TGA-декодер, не кодируйте его вручную. Вы просто напрашиваетесь на неприятности - в большинстве форматов изображений есть много тонкостей, и множество инструментов, которые не придерживаются точно в недостаточно указанном формате. Лучше всего найти существующий хорошо проверенный библиотечный код для обработки изображений.)

Мне бы хотелось, чтобы здесь был инструмент для преобразования из TGA в любой формат внутренней текстуры, плюс метаданные.

Как насчет аудио форматов? Возможно ли поддерживать только загрузку файлов WAV? Как насчет фоновых музыкальных файлов, которые часто бывают огромными.

Мы используем три формата: отслеживаемая музыка (.xm), ADPCM (.wav) и Speex (.spx). Это в основном потому, что мы используем портативные устройства, и эти форматы очень легки для декодирования.

Должен ли двигатель быть в состоянии динамически разбирать TTF и генерировать атлас? Упаковка текстур.

Atlasing - сложная проблема: посмотрите ответы на свои недавние вопросы . Это почти всегда стоит делать в автономном режиме.

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

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


В качестве обновления вы можете рассмотреть возможность использования формата файлов KTX для текстур. Преимущество этого structподхода заключается в том, что он в большинстве случаев «читается и работает» для большинства сценариев использования GL (и, судя по вашим комментариям, вы нацеливались на GL), оставаясь при этом гибким и четко определенным.

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

Leander
источник
Отличная вещь, спасибо. Я никогда не думал о создании собственного удобного для загрузки формата изображения. Есть ли уже встроенная минимальная библиотека загрузки текстур. Опять же, это в основном поток байтов с шириной, высотой и кодировкой (т.е. GL_RGB555).
deft_code
1
Не столько создавайте свой собственный формат изображения, сколько переводите изображение в точный формат, который нужен DirectX, GL или тому, что вы используете. =) Что касается библиотек: там есть тонна. Что касается инструментов, я обычно использую библиотеку ImageMagick ( imagemagick.org/script/index.php ) или даже программы ... Код ImageMagick является старомодным и немного уродливым, но довольно быстрым, гибким и дорогим -tested. Я уверен, что у других будет много других предложений; если вы используете, например, C # для своей цепочки инструментов, многие из этих вещей уже будут встроены в библиотеки .NET ...
leander
1
«Я уверен, что у других будет много других предложений» MFC! :) Или, может быть, OpenIL. Я думаю, что одним из важных моментов, связанных с выпуском ресурсов в форматы для конкретных платформ, является то, что по мере добавления большего количества исходных форматов и большего количества платформ количество комбинаций будет стремительно расти. Преобразование исходных ресурсов в промежуточный формат, а затем преобразование его в специфичные для платформы форматы сократит количество маршрутов преобразования. Добавьте другой исходный формат, просто напишите конвертер в промежуточный формат. Добавьте другую платформу, добавьте пекаря в целевой формат этих платформ.
Крис Хоу
1
Я бы добавил, что сохранение сложности вне движка не обязательно означает, что функциональность недоступна движку. Держать это отдельно, хотя так, чтобы это было легко отделено от двигателя, является ключом. Я не могу не подчеркнуть, насколько полезно поддерживать горячую загрузку активов, то есть перезагружать вещи на лету. Это также может внести много сложностей в вашу систему, хотя вы захотите убедиться, что она построена таким образом, что игре не нужно заботиться о том, откуда берутся ресурсы.
дэш-том-бэнг
3

Ваши вопросы звучат очень субъективно и сильно зависят от вашей целевой аудитории.

Давайте ответим на ваш вопрос о разборе шрифта / ttf. Если вы планируете, чтобы моддеры добавляли свой собственный шрифт, то вы, вероятно, захотите сделать процесс импорта как можно меньше. Если вы добавляете в игру много шрифтов / размеров шрифтов для внутреннего использования, возможно, вам нужен какой-то изощренный инструмент, который художник может использовать с небольшой подготовкой. Если вы собираетесь делать это один раз внутри страны, то время, которое вы тратите на создание правильного импортера, вероятно, будет меньше, чем время, затрачиваемое на написание инструментов для предыдущих случаев.

Это действительно вопрос масштаба со всем остальным. Встроенные инструменты стоят усилий, когда вы делаете что-то много раз и хотите уменьшить сложность / ошибки, возникающие в результате. Каждый добавляемый вами дополнительный классификатор (т. Е. Только текстуры TGA вместо импорта, скажем, PSD) приводит к тому, что конечный пользователь тратит больше времени.

Помните, что инструменты контента обычно используются менее технически склонными (читай: художниками). Лично мне очень нравится, как работает Unity, когда вы можете просто перетащить исходный файл (psd, 3ds, ttf, mp3, jpg, mov и т. Д.), И он автоматически преобразует его во внутренний формат. Внутренний формат в основном скрыт от конечного пользователя. Он также автоматически реконвертируется, когда обнаруживает изменение исходного файла. Но это много работы.

тетрада
источник