Это продолжение этого вопроса . В настоящее время я пишу простую игру и ищу самый быстрый способ (многократно) отображать массив данных RGB в окне Win32 без мерцания или других артефактов.
В ответах на предыдущие были рекомендованы несколько различных подходов. вопрос, но не было единого мнения о том, какой из них будет быстрее всего. Итак, я собрал тестовую программу. Код просто многократно отображает буфер кадра на экране с максимально возможной скоростью.
Это результаты, которые я получил для 32-битных данных, работающих в 32-битном видеорежиме - они могут удивить некоторых людей:
- Direct3D (1): 500 fps
- Direct3D (2): 650 fps
- DirectDraw (3): 1100 fps
- DirectDraw (4): 800 fps
- GDI (SetDIBitsToDevice): 2000 fps
Учитывая эти цифры:
Вот краткое описание вызовов, сделанных каждым из 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();