这是对此问题的跟进。我正在编写一个简单的游戏,想找到在Win32窗口中以最快的方式(反复)显示RGB数据数组的方法,而且不会出现闪烁或其他伪像。
针对上一个问题的答案中推荐了几种不同的方法,但没有达成哪种方法最快的共识。因此,我编写了一个测试程序。该代码只是尽可能快地反复显示屏幕上的帧缓冲区。
以下是我在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();