Как улучшить производительность потоковой передачи текстур Direct3D?

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

Я использую 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

Спасибо!


person Sam Lantinga    schedule 06.02.2011    source источник


Ответы (2)


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

person Jiho Choi    schedule 27.07.2011

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

person Axel Gneiting    schedule 06.02.2011
comment
Я пробовал это давным-давно, когда не использовал динамические текстуры, и поскольку на каждый кадр приходится только один DrawPrimitiveUP, это не имело значения. Будет ли это иметь большее влияние на динамические текстуры? - person Sam Lantinga; 06.02.2011
comment
Если проблема не в DrawPrimitiveUP, я бы предположил, что для каждого кадра есть накладные расходы на драйвер, которые ограничивают максимальное ускорение. Вы должны пытаться увеличивать объем работы, выполняемой в каждом кадре вашего теста. - person Axel Gneiting; 06.02.2011