Введение

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 обычно не хватает даже для простых игр. Например, в нём нет встроенной поддержки текстурных атласов.

Поэтому скорее всего вам придётся добавлять поддержку нового типа ассетов. А для этого потребуется делать полноценный конвейер:

  1. Importer — загрузка ассета во внутренний объект

  2. Processor — обработка (premultiply, сжатие и т.д.)

  3. Writer — сохранение в .xnb формат

  4. Reader — загрузка из .xnb

Из-за этого объём кода и сложность резко возрастают. При загрузке же ассетов в сыром виде шаги 3 и 4 просто не нужны. Меньше кода — меньше багов, проще поддержка, быстрее разработка.

Отдельно стоит сказать про отладку собственных конвейеров — это целый квест(по крайней был целым квестом n лет назад, когда я пытался это сделать).

Альтернативы

К счастью, в MonoGame можно загружать ассеты и без Content Pipeline:

  • Texture2D.FromStream() — для изображений

  • SoundEffect.FromStream() — для звуков

  • Effect — есть конструктор, куда можно передать шейдер скомпилированный через mgfxc(для FNA через fxc)

  • SpriteFont — есть конструктор, куда можно передать текстуру атласа и глифы. В FNA этот же конструктор доступен через reflection.

На базе этого можно легко написать свой загрузчик ассетов.

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

Библиотека

Что делает

XNAssets

Универсальная альтернатива Content Pipeline. Загрузка текстур, звуков, SpriteFont и эффектов в сыром виде. Легко расширяется.

SpriteFontPlus

Создание SpriteFont нужного размера и набора символов из TTF-файлов.

FontStashSharp

Библиотека для отрисовки текста с динамическим атласом, rich text, harfbuzz, стилями и многим другим.

DigitalRiseModel

Загрузка 3D-моделей из glTF/glb + полноценный движок анимации.

PlMpegNet

Простая библиотека для загрузки видео.

Ссылки

Мнение создателя FNA: The XNA Content Pipeline Is Bad and You Shouldn’t Use It