Direct3D: эффективный способ получить растровое изображение системной памяти из IDirect3DSurface9 (пул по умолчанию)? - PullRequest
5 голосов
/ 13 декабря 2010

У меня IDirect3DSurface9, пул по умолчанию, формат YUV.Как я могу эффективно получить битовые биты из него?На данный момент я:

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

спасибо

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Хорошо, как указывает interjay ... вы почти все делаете "правильным" способом.

Очевидные улучшения - это один раз вызвать CreateRenderTarget и CreateOffscreenPlainSurface, а затем повторно использовать их несколько раз.Самый быстрый способ вернуть биты обратно - это непосредственно заблокировать поверхность.

Более того, если вам нужно сделать это в реальном времени на чем-то похожем на видео, вероятно, было бы лучше настроить массивповерхности (оба типа).Затем вы можете загрузить несколько YUV-кадров на поверхность CreateRenderTarget, а затем, как только вы заполните массив, скопировать первый в OffscreenPlainSurface и заблокировать его.

Таким образом вы разрешите конвейеризацию большего количества команд и прекратите вызывать блокировку и ФОРМИРОВАТЬ синхронизацию конвейера (т. Е. Поверхность, которую вы блокируете, ДОЛЖНА быть готова перед продолжением, что вызывает синхронизацию конвейера).

3 голосов
/ 13 декабря 2010

Поскольку вы создаете цель рендеринга в режиме блокировки (шестой параметр для CreateRenderTarget), вы можете заблокировать цель рендеринга с помощью LockRect и скопировать данные непосредственно оттуда.

MSDN не рекомендует использовать блокируемые цели рендеринга, а говорит :

Если вам нужен доступ для чтения для целей рендеринга, используйте GetRenderTargetData вместо блокируемого оказывать цели.

Таким образом, альтернативой является вызов GetRenderTargetData на внеэкранную поверхность, а затем блокирование внеэкранной поверхности (вместо использования DC и растровых изображений).

...