Введение
Content Pipeline — это официальный способ работы с ассетами в MonoGame. Однако в сообществе уже давно существует немалая группа разработчиков, которые его не любят и предпочитают загружать ассеты в «сыром» виде. Особенно это заметно в сообществе FNA(ещё одной реализации XNA4) — там такой подход используют практически все.
Я тоже давно в этой «партии» и в этой статье объясню, почему.
Сначала разберём реальные преимущества Content Pipeline, потом главный недостаток, а в конце — какие альтернативы есть на практике.
Плюсы Content Pipeline
1. Скорость загрузки
Ассеты после обработки через Content Pipeline сохраняются в оптимизированном бинарном формате (.xnb). Они уже прошли все необходимые преобразования (например, premultiplied alpha для текстур), поэтому загружаются очень быстро.
Однако для большинства инди-проектов этот плюс сильно переоценён. На современном железе даже большие наборы ассетов загружаются практически мгновенно — с обработкой или без неё.
К тому же, если нужна максимальная скорость, можно просто заранее сконвертировать текстуры в актуальные форматы (DDS, KTX, Basis Universal) с помощью ImageMagick или других инструментов.
2. Защита ассетов
Некоторым разработчикам важно, чтобы ассеты было сложнее украсть. В этом плане XNB-файлы действительно чуть лучше, чем обычные PNG или WAV.
Но стоит признать: при наличии минимальных навыков программирования вытащить ассеты из .xnb довольно просто.
Сверх того, у защиты ассетов есть обратная сторона — чем сильнее «защита», тем сложнее игрокам делать моды.
3. Оптимизация под платформы
Content Pipeline автоматически подбирает оптимальный формат сжатия под целевую платформу (напр. для картинок это DXT, PVRTC, ETC и т.д.). Этот пункт действительно актуален и здесь сложно спорить.
Главный недостаток
Несмотря на все плюсы, базовых возможностей Content Pipeline обычно не хватает даже для простых игр. Например, в нём нет встроенной поддержки текстурных атласов.
Поэтому скорее всего вам придётся добавлять поддержку нового типа ассетов. А для этого потребуется делать полноценный конвейер:
Importer — загрузка ассета во внутренний объект
Processor — обработка (premultiply, сжатие и т.д.)
Writer — сохранение в
.xnbформатReader — загрузка из
.xnb
Из-за этого объём кода и сложность резко возрастают. При загрузке же ассетов в сыром виде шаги 3 и 4 просто не нужны. Меньше кода — меньше багов, проще поддержка, быстрее разработка.
Отдельно стоит сказать про отладку собственных конвейеров — это целый квест(по крайней был целым квестом n лет назад, когда я пытался это сделать).
Альтернативы
К счастью, в MonoGame можно загружать ассеты и без Content Pipeline:
Texture2D.FromStream()— для изображенийSoundEffect.FromStream()— для звуковEffect— есть конструктор, куда можно передать шейдер скомпилированный через mgfxc(для FNA через fxc)SpriteFont— есть конструктор, куда можно передать текстуру атласа и глифы. В FNA этот же конструктор доступен через reflection.
На базе этого можно легко написать свой загрузчик ассетов.
Кроме того, за годы я написал и активно поддерживаю несколько библиотек именно под этот подход:
Библиотека | Что делает |
|---|---|
Универсальная альтернатива Content Pipeline. Загрузка текстур, звуков, SpriteFont и эффектов в сыром виде. Легко расширяется. | |
Создание SpriteFont нужного размера и набора символов из TTF-файлов. | |
Библиотека для отрисовки текста с динамическим атласом, rich text, harfbuzz, стилями и многим другим. | |
Загрузка 3D-моделей из glTF/glb + полноценный движок анимации. | |
Простая библиотека для загрузки видео. |
Ссылки
Мнение создателя FNA: The XNA Content Pipeline Is Bad and You Shouldn’t Use It
