Windows DirectDraw游戏可以访问backbuffer而不锁定它吗?

Windows DirectDraw游戏可以访问backbuffer而不锁定它吗?,windows,directx,gpu,directdraw,Windows,Directx,Gpu,Directdraw,我正在修改一个旧的Windows DirectDraw游戏。我已经创建了一个DirectDraw代理。它记录每个IDirectDraw和IDirectDrawSurface调用。backbuffer在oneBltFastcall之后看起来像这样: 在下一个BltFast调用之前,像这样: 在任何BltFast调用之前和之后,通过ing copying-Unlocking backbuffer转储这些图片。 这两个BltFast调用之间没有其他IDirectDraw(Surface)调用,特别

我正在修改一个旧的Windows DirectDraw游戏。我已经创建了一个DirectDraw代理。它记录每个IDirectDraw和IDirectDrawSurface调用。backbuffer在one
BltFast
call之后看起来像这样:

在下一个
BltFast
调用之前,像这样

在任何
BltFast
调用之前和之后,通过
ing copying-
Unlock
ing backbuffer转储这些图片。
这两个
BltFast
调用之间没有其他IDirectDraw(Surface)调用,特别是没有
Lock
/
Unlock
调用。这怎么可能呢?

据我所知,游戏可能分为多个阶段,而你正处于这两个阶段之间。也就是说,游戏调用blit一次来渲染背景,然后再次(可能多次)渲染交互式“精灵”。(但是,顺序可以颠倒,这意味着您捕获的第二帧实际上是下一个循环的第一层。)

就backbufer而言,我可以在DirectDraw的MSDNs文档中找到:

如果硬件支持,BltFast始终尝试异步blit

所以这可能是一场竞赛,但我可以想象,任何锁定的尝试都会被阻止,直到这一切完成

而且。。。

不要从曲面的锁定区域调用DirectDraw bitblt函数来创建bitblt。如果执行此操作,bitblt将返回DDERR_SURFACEBUSY或DDERR_LOCKEDSURFACES。当在锁定的视频内存表面上使用时,GDI blit函数也会自动失效

这意味着bitblt本身具有锁定语义。由于GDI不允许访问显式锁定的表面,所以它也很可能无法访问异步BLIT操作中间的一个表面。 因此,为了具体回答您的问题,GDI似乎可以访问曲面而不锁定它

当然,在性能的名义下可以做各种各样的奇怪的事情,所以谁知道他们可能会做什么其他类型的黑客呢


不过我要说的是,我在DirectDraw的任何方面都不是专家,我的工作假设是backbuffer与任何其他曲面一样。

完全胡乱猜测:第二张图像是否可能是第一次BltFast调用的结果,在第一次锁定/复制/解锁时,它实际上没有通过管道?嗯。。。我不这么认为。。。据我所知,这个API是直接和同步的。我认为有一些可能绕过DirectDraw API。只有非常动态的对象才会以这种方式绘制。只有对DirectDraw和WinApi有深入了解的人才能知道。DirectDraw是否可以与GDI结合使用?在这种情况下,您可能应该查看修改上述后台缓冲区的潜在GDI或GDI+调用