代码之家  ›  专栏  ›  技术社区  ›  user200783

为什么不使用GDI重复地用数组中的RGB数据填充窗口呢?

  •  14
  • user200783  · 技术社区  · 14 年前

    这是对 this question . 我目前正在编写一个简单的游戏,并寻找最快的方式(反复)显示一个数组的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对于这个操作来说太慢了?
    • 有什么理由比SetDIBitsToDevice更喜欢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();
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   Jerry Coffin    14 年前

    这里有几件事要记住。首先,很多“常识”是建立在一些事实的基础上的,这些事实已经不再适用。

    在AGP时代,当CPU直接与GPU通信时,它总是使用基本的PCI协议,这种情况以1x的速率发生(总是不可避免)。AGX 2x/4x/8x型 只有 内存控制器 直接的。换句话说,取决于 什么时候

    然而,当事情转到PCI-E时,情况就完全改变了。虽然根据路径的不同,带宽可能会有所不同,但并没有一般的规则规定内存-GPU将比CPU-GPU快。最安全的概括是 如果

    在您的例子中,这并不重要——您正在讨论如何将数据从CPU空间移动到GPU空间。使用DirectX(或OpenGL)的主要速度差异发生在 在GPU上,完全避免使用CPU(或主内存)。它们(现在AGP已经成为历史)在内存显示带宽方面没有任何实质性的改进。

        2
  •  2
  •   Goz    14 年前

    杰里·科芬说得不错。要记住的是DI在setdibittodevice中代表什么。它代表独立于设备。也就是说你总是任由司机摆布。有些车手过去是完全的垃圾,这对性能影响很大。DirectDraw也遇到了类似的问题。。。但是您也可以访问硬件Blitter,因此它通常更有用。IHVs也倾向于花更多的时间为DirectDraw编写合适的驱动程序,因为它的游戏关联性。当硬件能够做得更好的时候,谁想成为性能堆的底部呢?

    相比之下,Direct3D性能如此糟糕的原因是,Direct3D本质上是完全用于GPU内部的,它使用奇怪和复杂的格式来提高缓存性能等等。

    再加上你没有测试like for like(使用DDraw和D3D),你可以创建一个纹理/表面,锁定它,复制,解锁,然后在后台缓冲区上画画(通过各种方法)。为了获得最佳性能,最好使用DISCARD锁直接锁定backbuffer,然后在解锁之前将memcpy直接锁定到返回的缓冲区中。这将使您的性能更接近SetDIBitsToDevice。不过,出于上述原因,我仍然预计D3D将比DDraw慢。

        3
  •  1
  •   James    14 年前

    你会听到人们对GDI不满的原因是它过去只是旧的windows API调用。它的新版本(上次查看em时称为GDI+)实际上只是一个放在DirectX调用之上的API。因此,有时使用GDI编程看起来相当简单,但是在事物之间添加一层总是会减慢速度。正如Jerry Coffin在回复中提到的,您的示例是关于移动数据的,这是一个缓慢的时间。虽然DirectX的速度慢了很多,但我还是有点惊讶,因为我无法帮助您深入研究DirectX文档(这在相当长的一段时间内非常棒,真的。。可能想看看www.codesampler.com。我总是从他身上找到很好的起点,事实上,虽然我可能会疯了,但我发誓在doc和示例中对DirectX SDK的改进是基于这些人的工作完成的!)

    不管怎样,希望这有帮助!