Почему бы не использовать GDI для многократного заполнения окна данными RGB из массива?

Это продолжение этого вопроса . В настоящее время я пишу простую игру и ищу самый быстрый способ (многократно) отображать массив данных 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();

16
задан Community 23 May 2017 в 12:16
поделиться