DXGI快速截屏錄屏技術
概述
很多地方都需要用到截屏/錄屏技術,比如桌面直播,桌面錄制等等。在微軟Windows平台,有很多截屏的接口,不過大多數性能並不理想,Windows8以后微軟引入了一套新的接口,叫“Desktop Duplication API”,應用程序,可以通過這套API訪問桌面數據。而由於Desktop Duplication API是通過Microsoft DirectX Graphics Infrastructure (DXGI)來提供桌面圖像的,速度非常快。由於是通過GPU,所以cpu占用率很低,性能很高。
還有一點有意思的是,Duplication API獲取到的桌面數據,不管顯示模式如何設置,都永遠是32位RGBA數據,其實這樣方便的多了,不用考慮其他可能的情況,比如24位等。
綜合來看,各方面秒殺GDI截屏技術,易用性上也比MirrorDriver技術好得多,是Windows8以后平台的截屏技術首選。
調用流程
首先,這套接口是集成在DirextX之中的,所以更大部分DirectX接口的使用方式基本一致,也就是通過D3D,各種QueryInterface,各種Enum,核心方法,是AcquireNextFrame。先簡單說下流程。
- 創建D3DDevice
- 通過一系列接口獲取路徑,獲取到IDXGIOutputDuplication接口
- 調用AcquireNextFrame,獲取當前桌面數據,保存在IDXGIResource中
- 把數據從GPU映射到內存中
- 拷貝需要的數據到自己的buffer里
其中,獲取到IDXGIOutputDuplication接口,是通過如下路徑:
IDXGIDevice --> IDXGIAdapter --> IDXGIOutput --> IDXGIOutput1 --> IDXGIOutputDuplication
關鍵代碼
創建接口
獲取一幀桌面數據
截屏性能測試
這里把他跟傳統的使用GDI截屏技術,進行對比。程序只截取桌面數據,然后把數據保存到自己的內存buffer中,不做其他操作。CPU有點差,如果是好點的cpu,性能數據應該是更好看,不過做對比還是很明顯能看出來的。
- CPU:i3-3120M,2.5GHZ,雙核四線程
- 系統:Windows10
- 內存:8GB
我的筆記本比較老了,所以GDI最多只能跑到20幀了,不過可以看到,即使這種情況下,當不設置幀率,也就是無限循環截屏的情況下,DXGI的性能只能用可怕來形容。。。
注意:上面最后表里的DXGI幀率當時應該是統計錯誤,實際到達不了這么高,很多是無效采集,但是有效采集的幀率也是非常高的,具體數據等我有時間了再做統計。(2019-03-22)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
haibindev.cnblogs.com,合作請聯系QQ。(轉載請注明作者和出處~)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++