Windows屏幕捕获技术分析
背景
要想提高录制的帧率,有两个关键因素:编码速度 和屏幕获取速度。本文主要记录Windows图形显示的基本概念,了解这些概念后,对于提速就有了明确的方向。
图形显示基本概念
Windows GDI
Windows GDI(Graphics Device Interface ,图形设备接口)是Windows操作系统最早期提供的一套用于绘图的API,允许程序在屏幕、打印机等输出设备上绘制文字、图像、线条等图形内容。可以通过其中的BitBlt函数拷贝屏幕内容,实现截图功能。
特点:
- 支持窗口录制
- 兼容性最好,适用于所有Windows版本
DirectX
GDI是早期的Windows图形接口,主要由CPU驱动,适用于简单图形绘制;DirectX是现代图形和多媒体API集合,核心由GPU驱动,适合游戏和高性能图形处理。这两种接口都可以使用,但DirectX更现代化、效率更高。
DirectX功能模块:

DXGI
DXGI(DirectX Graphics Infrastructure) 是Microsoft提供的一套接口:
- 是DirectX的一个子系统(基础设施层)
- 管理显卡适配器(GPU) 、输出设备(显示器) 、显示模式 、交换链(SwapChain)
- 提供底层功能,供Direct3D 10/11/12使用
- 和捕获屏幕本身没有直接关系,但提供了实现入口
Desktop Duplication API
Desktop Duplication API 是从Windows 8开始 引入的一组专门用于高效捕获桌面画面的接口。
核心函数:
cpp
IDXGIOutput1::DuplicateOutput
它实际上就是DXGI中的一部分功能,是通过DXGI提供的接口来实现桌面捕捉的。换句话说:Desktop Duplication API是DXGI提供的桌面捕获功能接口,是DXGI功能集的一部分。
特点:
- 多屏支持
- 不支持窗口录制。若窗口被遮挡或最小化,该区域会显示为被遮挡/黑屏/透明
常见屏幕捕获方法对比
| 方法/特性 | BitBlt(GDI) | Desktop Duplication API | DirectX(D3D) | Mirror Driver |
|---|---|---|---|---|
| 平均耗时(1080p) | 20~50ms | 2~8ms | 5~15ms | 1~5ms |
| CPU占用 | 高 | 低 | 中 | 极低 |
| GPU占用 | 低 | 中 | 中 | 高 |
| 适用系统 | 全Windows | Win8+ | 全Windows | 需安装驱动 |
| 单个窗口录制 | ✅支持 | ❌不直接支持,只能裁剪 | ✅支持 | ✅支持 |
| 遮挡窗口内容 | 仍可能录制(驱动支持) | ❌遮挡区域为遮挡内容 | 部分支持 | ✅完整支持 |
| 最小化窗口 | 有时能录,有时黑屏 | ❌黑屏 | 部分支持 | ✅完整支持 |
| 鼠标指针 | 手动叠加 | ✅可选自动附带 | 手动叠加 | 手动叠加 |
| 多显示器 | 部分支持 | ✅完整支持 | ✅支持 | ✅支持 |
| 游戏画面录制 | ❌撕裂严重 | ✅合适,OBS使用 | ✅合适 | ✅合适 |
补充:Windows Graphics Capture (WGC)
Windows 10 1903+ 引入了新的捕获API,支持窗口级捕获、最小化窗口录制,是未来推荐的方向。参考:Windows.Graphics.Capture介绍
DirectX与Desktop Duplication API的差异
判断一个程序使用DirectX还是Desktop Duplication API进行屏幕捕获,只要看到DuplicateOutput被调用,就基本可以确定使用的是Desktop Duplication API。即便后续用了CopyResource、Map、Unmap,也是正常的数据访问流程。
实战选型建议
各方案适用场景分析
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 办公软件/桌面录制 | Desktop Duplication API | 低CPU占用,帧率高 |
| 单窗口录制(需后台运行) | WGC或Mirror Driver | 支持最小化/遮挡录制 |
| 游戏录制/直播 | Desktop Duplication API | 无撕裂,OBS已验证 |
| 兼容老旧系统(Win7) | BitBlt | 全平台兼容 |
| 企业级远程桌面 | Mirror Driver | 极低延迟,但需驱动签名 |
性能优化建议
- 避免每帧重新创建资源:DXGI Surface和Texture应复用,减少GPU内存分配开销
- 使用GPU映射而非CPU拷贝:Map/Unmap比CopyResource更快
- 脏区域检测 :Desktop Duplication API提供
GetFrameDirtyRects,只更新变化区域 - 鼠标指针分离绘制:利用API提供的鼠标信息,避免每帧合成
实际项目选型经验
- OBS Studio:使用Desktop Duplication API,性能最优
- Teams/Zoom屏幕共享:WGC方案,支持窗口级捕获
- 企业远程控制软件:Mirror Driver或自研内核驱动
坑点提醒:
- Desktop Duplication不支持单个窗口,需自行裁剪
- WGC在某些虚拟机上不可用(需要WDDM 2.x驱动)
- BitBlt在高DPI屏幕上需设置DPI感知,否则截图模糊