win7下虚拟显示器完成记

来源:互联网 发布:java能开发单片机吗 编辑:程序博客网 时间:2024/05/16 17:31
将近3个月过去了,一直在做win7下虚拟显示器的显示。效果如下:


10月份我请了陪产假,老婆生了个漂亮的女儿,我也是儿女双全了,也有半个月的时间没有上班。
最开始我获取屏幕数据采用mirror驱动方式, mirror驱动是win7上微软官方支持的效率最高的截屏方式,但是目前来说有几个比较显著的缺点:
(1)只能截获主屏数据,扩展屏貌似不能截;
(2)有了mirror驱动就不能开启毛玻璃效果;
(3)对于有些场景,如PS的画图场景,开启硬件加速后,只要有开启mirror驱动,延时就会变得相当严重。
鉴于上述的种种原因,在开发完mirror驱动截图一个版本后,我决定放弃这种框架,因为后面的维护成本会很高,而且有很对硬伤是无法解决的,抛弃这种框架,我决定直接从wddm过滤驱动获取图片数据。
所以从9月份一开始我就转入了WDDM过滤驱动截获图片数据开发,先从支持非Areo效果的图片开始,期间也遇到了很多问题:
内存映射问题
(1)如何获取虚拟显示器surface地址?地址如何转换成我们可以访问的虚拟地址?
(2)如何获取图片更新区域?
(3)如何获取鼠标形状、位置?
为此我们需要阅读微软官方的资料:https://docs.microsoft.com/en-us/windows-hardware/drivers/display/video-memory-management-and-gpu-scheduling
内容比较多且比较抽象,但是是我们能找到的最好的教程,所以要耐心看完。
硬件加速图片拷贝速度慢问题
做了1-2个星期,上面的这些问题大都解决了,然后就会面临一个棘手的问题:拷贝速度慢问题,地址映射完后,我们是可以获取到FrameBuffer的虚拟地址的,也就是说我们可以直接读取FrameBuffer,这样一来直接从Framebuffer截屏就显得很方便了,但是不幸的是,直接从FrameBuffer将数据拷贝出来耗时相当大,我这边统计了下,拷贝一张1080P的图片大约在90ms左右,这是一个相当大的耗时,在实时传输上根本没法用。
然后10月份我就转到WDDM用户态模式驱动的分析了,分析完后发现这些问题在用户态驱动能够很好的解决,可以通过在用户态调用一些系统函数进行拷贝,系统拷贝就会触发DMA传输,大大提升拷贝速度。
毛玻璃效果支持问题
(1)毛玻璃效果开启后虚拟显示器不支持,会一直狂闪然后蓝屏;
(2)毛玻璃图片数据获取;
我这里支持介绍了个大概,如果有开发这类遇到问题可以留言咨询,我会尽力解答。




原创粉丝点击