这是对这个问题的跟进。我目前正在编写一个简单的游戏,并且正在寻找在 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 对于这个操作来说太慢了?
- 有什么理由比 SetDIBitsToDevice 更喜欢 DirectDraw 或 Direct3D?
以下是每个 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();