DirectDraw游戏可以在不锁定的情况下访问后备缓冲区吗?

cub*_*l42 11 windows directx gpu directdraw

我正在修改一个旧的Windows DirectDraw游戏.我已经创建了一个DirectDraw代理.它记录每个IDirectDraw和IDirectDrawSurface调用.一次通话,backbuffer看起来像这样BltFast:

在此输入图像描述

而像这样之前的下一个BltFast呼叫:

在此输入图像描述

通过在任何呼叫之前和之后Lock复制后备缓冲器Unlock来转储这些图像BltFast.这两个BltFast调用之间没有其他IDirectDraw(Surface)调用,尤其是没有Lock/ Unlock调用.这怎么可能?

Met*_*eta 1

据我所知,游戏似乎可能分多个阶段进行,而你正在中间抓住它。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 方面的专家,并且我的操作假设是后缓冲区与任何其他表面一样。