Это продолжение этого вопроса. В настоящее время я пишу простую игру и ищу самый быстрый способ (неоднократно) отображать массив данных RGB в окне Win32 без мерцания или других артефактов.
В ответах на предыдущий вопрос было рекомендовано несколько разных подходов, но консенсуса относительно того, что было бы самым быстрым, не было. Итак, я собрал тестовую программу. Код просто отображает фреймбуфер на экране несколько раз, как можно быстрее.
Это результаты, которые я получил, для 32-битных данных, работающих в режиме 32-битного видео, - они могут удивить некоторых людей:
- Direct3D (1): 500 fps
- Direct3D (2): 650 fps
- DirectDraw (3): 1100 fps
- DirectDraw (4): 800 fps
- GDI (SetDIBitsToDevice): 2000 fps
Учитывая эти цифры:
- Почему многие люди категорически отрицают, что GDI слишком медленна для этой операции?
- Есть ли какая-то причина предпочесть DirectDraw или Direct3D над SetDIBitsToDevice?
Вот краткое изложение вызовов, сделанных каждой из кодеков Direct *. Если кто-либо знает более эффективный способ использования DirectDraw/Direct3D, прокомментируйте.
1. CreateTexture(D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); DrawPrimitive()
2. CreateTexture(0, D3DPOOL_SYSTEMMEM); CreateTexture(0, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); UpdateTexture(); DrawPrimitive()
3. CreateSurface(); SetSurfaceDesc(lpSurface = &frameBuffer[0]);
memcpy(); primarySurface->Blt();
4. CreateSurface();
Lock(); memcpy(); Unlock(); primarySurface->Blt();