我一直在使用
Windows API的BitBlt功能来执行屏幕抓取.
但是有很多缺点:
> DWM和Aero导致了巨大的减速(3ms – > 35ms只是调用BitBlt) – 要解决这个问题,这将需要禁用我宁愿不做的Aero.屏幕闪烁,事情转移.
>数据必须重新传输到GPU才能将数据作为纹理加载
>没有CAPTUREBLT标志,无法捕获分层Windows.启用时,捕获时鼠标光标会闪烁.这似乎是一个小问题,但是当应用程序没有其他bug时,这是非常烦人的.作为一种解决方法,我打算将一个分层窗口渲染为一个附加的游标.
我已经在使用OpenGL显示和操纵捕获的屏幕数据. BitBlt给出了像素数据,并且将其加载到纹理中相对容易.然而,这是稍微荒谬的,因为当GPU开始使用时,我手动将数据重新发送回GPU.数据绝对是有的,但试图访问它是一个不同的事情.
我认为这个功能在供应商的待办事项列表中(或可能在任何列表中)可能不是很高,但是我想询问那些知道AMD(ATI)或NVidia在他们的驱动程序中读取屏幕缓冲区(例如,进入OpenGL上下文).我根本不了解现代GPU架构,知道从哪里开始挖掘答案.
OpenGL只能读取上下文framebuffer(一个窗口),以及您创建的任何帧缓冲区或pbuffers. OpenGL无法触摸桌面或任何其他窗口.
原文链接:https://www.f2er.com/windows/363801.html