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

时间:2014-06-17 20:57:53

标签: windows directx gpu directdraw

我正在修改一个旧的Windows DirectDraw游戏。我已经创建了一个DirectDraw代理。它记录每个IDirectDraw和IDirectDrawSurface调用。后备缓冲区看起来像之后一次BltFast来电:

enter image description here

喜欢这个之前下一个BltFast来电:

enter image description here

这些图片会在Lock来电之前和之后Unlock复制 - BltFast后备缓冲区转储。 这两个BltFast来电之间没有其他IDirectDraw(Surface)调用,尤其是没有Lock / Unlock来电。这怎么可能?

1 个答案:

答案 0 :(得分:1)

据我所知,看起来游戏可能会在多个阶段进行绘制,而你正在中间捕捉它。 IE,游戏调用blit一次渲染其背景,然后再次(可能多次)渲染交互式“精灵”。 (但是,顺序很可能会被颠倒,这意味着您捕获的第二帧实际上是下一个循环的第一层。)

就backbufer而言,我能够在DirectDraw的MSDNs文档中找到它: 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的专家,并且假设后备缓冲器就像任何其他表面一样。