Я думал, что * .DDS файлы предназначены для быстрой загрузки? - PullRequest
4 голосов
/ 22 сентября 2009

Хорошо, поэтому я пытаюсь взвесить все за и против использования различных методов сжатия текстур. Я трачу 99,999% своего времени на программирование двумерных спрайтов для компьютеров под управлением Windows с использованием DirectX.

До сих пор я смотрел на упаковку текстур (SpriteSheets) с альфа-обрезкой, и это похоже на достойный способ получить немного больше производительности. Теперь я начинаю смотреть на формат текстур, в котором они хранятся; в настоящее время все хранится как * .PNGs.

Я слышал, что файлы * .DDS хороши, особенно при использовании сжатия DXT5 (/ 3/1 в зависимости от задачи), поскольку текстура остается сжатой в VRAM? Также люди говорят, что, поскольку они уже являются DirectDraw-поверхностями, они загружаются намного быстрее, чем когда-либо.

Итак, я создал приложение, чтобы проверить это; Я вызываю линию ниже 20 раз, освобождая текстуру между каждым вызовом.

    for (int i = 0; i < 20; i++)
 {
  if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
  {
   return E_FAIL;
  }

  g_pTexture->Release();
  g_pTexture = NULL;
 }

Теперь, если я попробую это с текстурой DXT5, это займет в 5 раз больше времени, чем при загрузке в простом * .PNG. Я слышал, что если вы не генерируете Mipmaps, он может работать медленнее, поэтому я дважды проверил это. Затем я изменил программу, которую использовал для создания файла * .DDS, переключившись на собственный nvcompress.exe от NVIDIA, но ни один из них не дал никакого эффекта.

РЕДАКТИРОВАТЬ: Я забыл упомянуть, что файлы (* .png и * .dds) представляют собой одно и то же изображение, просто сохраненные в разных форматах. (Тот же размер, количество альфа, все!)

РЕДАКТИРОВАТЬ 2: При использовании следующих параметров он загружается почти в 2,5 раза быстрее и потребляет намного меньше VRAM!

 D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )

Однако теперь я теряю всю прозрачность текстуры, я смотрел на текстуру DXT5, и она отлично выглядит в Paint.NET и DirectX DDS Viewer. Однако при загрузке все прозрачность превращается в сплошной черный. Проблема с ColorKey?

РЕДАКТИРОВАТЬ 3: Не обращая внимания на этот последний бит, я был идиотом, и в своей спешке с «быстрым примером» я забыл включить альфа-смешивание на D3DXSprite-> Begin (). Doh!

Ответы [ 2 ]

14 голосов
/ 23 сентября 2009

Необходимо различать формат, в котором ваши файлы хранятся на диске, и формат, который текстуры в конечном итоге используют в видеопамяти. Сжатые текстуры DXT обеспечивают хороший баланс между использованием памяти и качеством в видеопамяти, но другие методы сжатия, такие как сжатие PNG или Jpeg, обычно приводят к меньшим файлам и / или лучшему качеству на диске.

Преимущество файлов DDS заключается в том, что они поддерживают форматы DXT напрямую и размещаются на диске так же, как DirectX ожидает, что данные будут размещены в памяти, поэтому после загрузки их требуется минимальное время ЦП для их преобразования в формат, который может использовать аппаратное обеспечение. Они также поддерживают предварительно созданные цепочки mipmap, которые не поддерживаются в таких форматах, как PNG. Сжатие изображения в форматы DXT - довольно трудоемкий процесс, поэтому обычно по возможности не рекомендуется выполнять его при загрузке.

Файл DDS с предварительно сгенерированными мип-картами того же размера, что и тот же формат, что и текстура видеопамяти, из которой вы планируете создавать, будет использовать наименьшее время процессора из всех стандартных форматов. Вы должны убедиться, что вы указали D3DX не выполнять масштабирование, фильтрацию, преобразование формата или генерацию mipmap, чтобы гарантировать это. D3DXCreateTextureFromFileEx позволяет вам указывать флаги, которые предотвращают любые внутренние преобразования (D3DX_DEFAULT_NONPOW2 для ширины и высоты изображения, если ваше оборудование поддерживает мощность двух текстур, D3DFMT_FROM_FILE для предотвращения генерации mipmap или преобразования формата, D3DX_FILTER_NONE для предотвращения любых фильтрация или масштабирование).

Время процессора - это только половина истории. В наши дни процессоры довольно быстрые, а жесткие диски относительно медленные, поэтому иногда общее время загрузки может быть короче, если вы загружаете сжатый файл меньшего формата, такой как PNG или JPG, а затем выполняете много работы с ЦП для его преобразования, чем если вы загружаете больший файл как DDS и просто сделать memcpy в видеопамять. Обычный подход, который дает хорошие результаты, заключается в том, чтобы сжать файлы DDS и распаковать их для быстрой загрузки с диска и минимальной стоимости процессора для преобразования формата.

Форматы сжатия, такие как PNG и JPG, сжимают некоторые изображения более эффективно, чем другие. DDS - это фиксированный коэффициент сжатия - данное разрешение изображения и формат всегда будут сжиматься до одного и того же размера (именно поэтому он больше подходит для аппаратной декомпрессии). Если вы используете для тестирования простые нерепрезентативные изображения (например, однородный цвет или простой рисунок), тогда ваш файл PNG, вероятно, будет очень маленьким и будет загружаться с диска быстрее, чем обычное игровое изображение.

1 голос
/ 22 сентября 2009

Сравните загрузку стандартного PNG и затем сжатие его до времени, которое требуется для загрузки файла DDS.

Тем не менее я не понимаю, почему PNG загружается быстрее, чем та же текстура, сжатая DXT5. Для одного это будет немного меньше, поэтому он должен загружать диск быстрее! Эта текстура DXt5 такая же, как текстура PNG? то есть они одинакового размера?

Вы пытались играть с D3DXCreateTextureFromFileEx? У вас гораздо больше контроля над тем, что происходит. Это может помочь вам.

...