Лучший способ обновить текстуру Direct3D

Мне нужно визуализировать некоторые изображения, созданные процессором, в Direct3D 9, и я не уверен, как лучше всего передать данные текстуры на графическую карту, поскольку, похоже, существует несколько подходов.

Мой путь использования проходит по следующим строкам в каждом кадре

  1. Рендерить кучу вещей с текстурами
  2. Обновите несколько частей текстуры (которые могли быть использованы в предыдущих рендерах).
  3. Рендерим еще что-нибудь с текстурой
  4. Обновите другую часть текстуры
  5. и так далее

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

  • Какой пул текстуры лучше всего подходит для этой задачи?
  • Whats the best way to update this texture?
    1. Call LockRect and UnlockRect for each region I need to update
    2. Вызовите LockRect и UnlockRect для всей текстуры.
    3. Вызовите LockRect и UnlockRect для всей текстуры с D3DLOCK_DISCARD и скопируйте растровое изображение из ОЗУ.
    4. Создавайте совершенно новую текстуру каждый раз, когда мне нужно ее «обновить».
    5. Используйте 1,2 или 3 для обновления поверхности в D3DPOOL_SYSMEM, затем UpdateSurface для обновления уровня 0 моей текстуры с этой поверхности.
    6. То же, что и 5, но укажите RECT, чтобы покрыть всю нужную мне область.
    7. То же, что и 5, но сделайте несколько звонков, по одному для каждого региона, который я обновил.
    8. Возможно, еще один способ сделать это, о котором я еще не подумал...

Следует отметить, что области, которые я обновляю, обычно довольно малы по сравнению с размером всей текстуры, например, текстура может быть 1024*1024, и я могу обновить 5 или около того 64*64 ее областей.


person Fire Lancer    schedule 28.07.2009    source источник


Ответы (2)


Если вам нужно обновить несколько областей, вы должны заблокировать всю текстуру и использовать флаг D3DLOCK_NO_DIRTY_UPDATE, а затем для каждой области вызвать AddDirtyRect перед разблокировкой.

Это, конечно, все зависит от размера текстуры и т. д. Для небольшой текстуры может быть более эффективно скопировать все это из оперативной памяти.

person croxmeister    schedule 07.08.2009

  • D3DPOOL_DEFAULT
  • D3DUSAGE_DYNAMIC
  • вызовите LockRect и UnlockRect для каждого региона, который вам нужно обновить

--> Это самый быстрый!

Бенчмарк будет следовать...

person SuperPro    schedule 28.07.2009