Как улучшить производительность потоковой текстуры Direct3D? - PullRequest
4 голосов
/ 06 февраля 2011

Я пытаюсь ускорить отрисовку полноэкранной текстуры, которая меняет каждый кадр. В моей системе я могу получить около 1000 FPS, используя GDI и BitBlt (), но я думал, что смогу улучшить производительность, используя Direct3D и динамические текстуры. Вместо этого я получаю только около 250 FPS.

Я работаю на Mac Pro с ATI HD 4870 с текущими драйверами.

Я пытался использовать динамические текстуры, и это дает мне небольшое усиление (~ 15FPS), и я пытался использовать цепочку текстур, чтобы избежать задержки конвейера, и это не имеет никакого эффекта.

Я немного осмотрелся и очень мало информации об использовании динамических текстур таким образом.

Я что-то упустил?

Настройка устройства:

pparams.BackBufferCount = 1;
pparams.SwapEffect = D3DSWAPEFFECT_DISCARD;
pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

Создание текстуры:

device->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC,
                      D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL);

Обновление текстуры:

texture->LockRect(0, &locked, NULL, D3DLOCK_DISCARD);
... write texture data
texture->UnlockRect(0);
device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, sizeof(*vertices));
...

Вы можете получить код незавершенного производства от http://www.libsdl.org/tmp/SDL-1.3.zip

Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Если вам не нужно считывать текстуру, вы можете создать текстуру с флагом (D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY).

1 голос
/ 06 февраля 2011

DrawPrimitiveUP очень медленный. Вы должны использовать динамический буфер вершин (обновить с помощью nooverwrite, отбросить, если он заполнен).

...