2013-11-29 4 views
1

Я пишу приложение с DirectX11 Direct2D, частью которого является загрузка и рисование последовательностей файлов изображений в реальном времени (видеоопределение). Размер этих файлов изображений различается (100x100 ~ 2000x2000 x RGBA). Будут оптимизация, предварительная загрузка (предварительная буферизация) логики, но я хочу понять, что это за правильная/лучшая практика/метод для этого.Загрузка изображений с диска и их рисование в ресурс Direct2D

Вот текущий рабочий процесс, я следую:

  1. Загрузить файл с WIC,
  2. Преобразовать в PBGRA Картинку (по желанию),
  3. Блокирование WIC пикселей,
  4. Создание D2D1Bitmap с помощью этого пиксельные данные

Однако проблема в том, что это медленно. Это узкие места в точке №4 - передача данных пикселя в VRAM. Поэтому я ищу более быстрый способ (т. Е. Самый быстрый).

Итак, есть ли способ загрузить изображение в виде текстуры или иным способом непосредственно в качестве ресурса DirectX, чтобы я мог минимизировать время для всего процесса/итерации? И в конечном итоге избежать использования компонента WIC?

Заранее спасибо С наилучшими пожеланиями

+0

На шаге 4 вы используете 'CreateBitmapFromWicBitmap' ([MSDN здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd371797%28v=vs.85%29.aspx))? Если нет, вы должны попробовать, если это так, то я не понимаю, зачем вам нужен шаг 3. –

+0

Извините, я забыл упомянуть - я использую ID2D1DeviceContext :: CreateBitmap() ([msdn] (http://msdn.microsoft .com/EN-US/библиотека/окна/настольные/jj841129 (v = vs.85) .aspx)). Я также пробовал метод ID2D1DeviceContext :: CreateBitmapFromWicBitmap, они кажутся похожими в perforamce. Да, тогда мне не нужно блокировать WIC pixeldata. Во всяком случае, в моем случае (используя оба метода) для загрузки растрового изображения HD (1920 × 1080) в D2D1Bitmap требуется до 30 мс. Это слишком медленно для моих нужд. –

+0

Итак, предполагая RGBA, это около 260 мегабайт в секунду, которую вы достигаете. На что способен ваш аппарат? –

ответ

0

После некоторых исследований и экспериментов я пришел следующим раствором:

Общий подход

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

Еще одна вещь, которую я сделал, заключалась в том, чтобы подготовить мои данные растрового изображения в формате B8R8G8A8_UNORM (это формат WIC 32bppPBGRA), поэтому я могу избежать преобразования в этот формат пикселей во время выполнения.

для Windows 8,1

Я не проверить это, но мне кажется, с ОС Windows 8.1 Direct2D обеспечивает поддержку сжатия блока для ID2D1Bitmap (msdn). Это означает, что вы можете подготовить большое растровое изображение в формате DDS и загрузить их непосредственно в видеопамять, что будет гораздо меньше данных, связанных с несжатым растровым изображением.

Смежные вопросы