12

我正在修改旧的 Windows DirectDraw 游戏。我创建了一个 DirectDraw 代理。它记录每个 IDirectDraw 和 IDirectDrawSurface 调用。一次调用,后备缓冲区如下所示:BltFast

在此处输入图像描述

在下一次通话之前像这样:BltFast

在此处输入图像描述

这些图片是通过在任何调用之前和之后复制Lock后台缓冲区来转储的。这两个调用之间没有其他 IDirectDraw(Surface) 调用,尤其是没有/调用。这怎么可能?UnlockBltFastBltFastLockUnlock

4

1 回答 1

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 方面的专家,并且我的操作假设是后缓冲区就像任何其他表面一样。

于 2016-08-18T23:22:22.517 回答