【发布时间】:2011-09-24 15:32:57
【问题描述】:
我一直在使用 Windows API 的 BitBlt 函数来执行屏幕抓取。
但是有很多缺点:
- DWM 和 Aero 会导致大幅减速(3 毫秒 --> 35 毫秒,只需调用
BitBlt)——要解决这个问题,需要禁用 Aero,而我宁愿不这样做。屏幕闪烁,事情发生了变化。 - 必须将数据重新传输到 GPU 才能将数据加载为纹理
- 如果没有
CAPTUREBLT标志,则无法捕获分层窗口。启用后,捕获时鼠标光标会闪烁。这似乎是一个小问题,但当应用程序没有错误时,它会非常烦人。作为解决方法,我打算将分层窗口渲染为附加光标。
我已经在使用 OpenGL 来显示和操作捕获的屏幕数据。 BitBlt 给了我像素数据,将它加载到纹理中相对容易。然而,这有点荒谬,因为当数据应该在 GPU 上可用时,我手动将数据重新发送回 GPU。数据肯定在那里,但尝试访问它是另一回事。
我认为此功能在供应商的待办事项列表中(或可能在任何列表中)并不高,但我想问问知情人士 AMD 是否提供了任何规定( ATI)或 NVidia 在其驱动程序中用于读取屏幕缓冲区(例如,进入 OpenGL 上下文)。我对现代 GPU 架构的了解还不够,不知道从哪里开始寻找答案。
【问题讨论】:
标签: windows opengl screenshot fullscreen