cub*_*l42 11 windows directx gpu directdraw
我正在修改一个旧的Windows DirectDraw游戏.我已经创建了一个DirectDraw代理.它记录每个IDirectDraw和IDirectDrawSurface调用.一次通话后,backbuffer看起来像这样BltFast
:
而像这样之前的下一个BltFast
呼叫:
通过在任何呼叫之前和之后Lock
复制后备缓冲器Unlock
来转储这些图像BltFast
.这两个BltFast
调用之间没有其他IDirectDraw(Surface)调用,尤其是没有Lock
/ Unlock
调用.这怎么可能?
据我所知,游戏似乎可能分多个阶段进行,而你正在中间抓住它。IE 中,游戏调用一次 blit 来渲染其背景,然后再次调用一次(可能多次)来渲染交互式“精灵”。(但是,顺序很可能相反,这意味着您捕获的第二帧实际上是下一个循环的第一层。)
就后台缓冲区而言,我可以在 DirectDraw 的 MSDN 文档中找到它: https://msdn.microsoft.com/en-us/library/windows/desktop/gg426183 (v=vs.85).aspx
如果硬件支持,BltFast 始终会尝试异步 blit。
所以这可能是一场比赛,但我想任何锁定尝试都会被阻止,直到比赛完成。
不要从表面的锁定区域调用 DirectDraw bitblt 函数来进行 bitblt。如果这样做,bitblt 将返回 DDERR_SURFACEBUSY 或 DDERR_LOCKEDSURFACES。当在锁定的视频内存表面上使用时,GDI blit 函数也会默默地失败。
这意味着 bitblt 本身具有锁定语义。由于不允许 GDI 访问显式锁定的表面,因此它也可能无法在异步 blit 操作中访问表面。
因此,为了具体回答您的问题,GDI 似乎可以在不锁定表面的情况下访问它。
当然,有各种各样的奇怪的事情可以以性能的名义完成,所以谁知道他们可能还做了什么其他类型的黑客呢?
但我要说的是,我无论如何都不是 DirectDraw 方面的专家,并且我的操作假设是后缓冲区与任何其他表面一样。
归档时间: |
|
查看次数: |
371 次 |
最近记录: |