Введение
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(fxcдля FNA) -
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
ссылка на оригинал статьи https://habr.com/ru/articles/1039344/