Por que não usar GDI para preencher repetidamente uma janela com dados RGB de uma matriz?

Este é um acompanhamento paraessa questão. Atualmente, estou escrevendo um jogo simples e estou procurando a maneira mais rápida de (repetidamente) exibir uma matriz de dados RGB em uma janela do Win32, sem tremer ou outros artefatos.

Várias abordagens diferentes foram recomendadas nas respostas à pergunta anterior, mas não havia consenso sobre qual seria a mais rápida. Então, juntei um programa de teste. O código simplesmente exibe um buffer de quadro na tela repetidamente, o mais rápido possível.

Estes são os resultados que obtive para dados de 32 bits em execução no modo de vídeo de 32 bits - eles podem surpreender algumas pessoas:

- Direct3D (1):             500 fps
- Direct3D (2):             650 fps
- DirectDraw (3):          1100 fps
- DirectDraw (4):           800 fps
- GDI (SetDIBitsToDevice): 2000 fps

Dados esses números:

Por que muitas pessoas afirmam que o GDI é simplesmente muito lento para esta operação?Existe algum motivo para preferir o DirectDraw ou o Direct3D em vez de SetDIBitsToDevice?

Aqui está um breve resumo das chamadas feitas por cada um dos caminhos de código Direct *. Se alguém souber uma maneira mais eficiente de usar o DirectDraw / Direct3D, comente.

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();

questionAnswers(3)

yourAnswerToTheQuestion