据我所知,看起来游戏可能会分多个阶段进行,而您正在中间进行。IE,游戏调用 blit 一次来渲染其背景,然后再次(可能多次)渲染交互式“精灵”。(但是,顺序很可能颠倒过来,这意味着您捕获的第二帧实际上是下一个循环的第一层。)
就后备缓冲区而言,我能够在 DirectDraw 的 MSDN 文档中找到它: https ://msdn.microsoft.com/en-us/library/windows/desktop/gg426183(v= vs.85).aspx
如果硬件支持,BltFast 总是尝试异步 blit。
所以这可能是一场比赛,但我想任何锁定尝试都会阻塞,直到完成。
还有...
https://msdn.microsoft.com/en-us/library/windows/desktop/gg426208%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
不要调用 DirectDraw bitblt 函数来从表面的锁定区域进行 bitblt。如果这样做,bitblt 将返回 DDERR_SURFACEBUSY 或 DDERR_LOCKEDSURFACES。GDI blit 函数在锁定的视频内存表面上使用时也会静默失败。
这意味着 bitblt 本身具有锁定语义。鉴于不允许 GDI 访问显式锁定的表面,它也很可能无法在异步 blit 操作中间访问表面。
因此,为了具体回答您的问题,GDI 似乎可以在不锁定表面的情况下访问表面。
当然,以性能的名义可以做各种奇怪的事情,那么谁知道他们还做了什么其他的黑客行为呢?
不过我会说,我无论如何都不是 DirectDraw 方面的专家,并且我的操作假设是后缓冲区就像任何其他表面一样。