Windows 8引入了新的 Microsoft DirectX 图形基础结构 (DXGI) API,使独立软件供应商 (ISV) 更容易地支持桌面协作和远程桌面访问方案。
此类应用程序在企业和教育方案中广泛使用。 这些应用程序有一个共同的要求:访问桌面内容以及将内容传输到远程位置的能力。 Windows 8桌面复制 API 提供对桌面内容的访问权限。
目前,没有 Windows API 允许应用程序无缝实现此方案。 因此,应用程序使用镜像驱动程序、屏幕抓取和其他专有方法来访问桌面内容。 但是,这些方法具有以下一组限制:
- 优化性能可能很困难。
- 这些解决方案可能不支持较新的图形呈现 API,因为这些 API 是在产品交付后发布的。
- Windows 并不总是提供丰富的元数据来帮助优化。
- 并非所有解决方案都与 Windows Vista 和更高版本的 Windows 中的桌面组合兼容。
Windows 8引入了一个名为桌面重复 API 的基于 DXGI 的 API。 此 API 提供对桌面内容的访问,方法是使用位图和关联的元数据进行优化。 此 API 适用于已启用 Aero 主题,并且不依赖于应用程序使用的图形 API。 如果用户可以在本地控制台上查看应用程序,则也可以远程查看内容。 这意味着即使全屏 DirectX 应用程序也可以复制。 请注意,API 提供保护,防止访问受保护的视频内容。
1.架构设计与系统集成
1.1 多层级协作架构
- Windows桌面复制API构建在DirectX图形基础架构之上,形成四层核心架构:
- 应用层:通过DXGI 1.2+接口发起捕获请求
- 合成层:DWM(Desktop Window Manager)负责管理桌面元素合成
- 驱动层:WDDM 2.0+驱动处理GPU资源调度
- 硬件层:GPU实现帧缓冲区的快速存取
graph TD A[应用程序] -->|IDXGIOutput5| B(DXGI运行时) B -->|DWM共享表面| C[桌面窗口管理器] C -->|DirectFlip| D[WDDM驱动] D -->|DMA传输| E[GPU显存]
1.2 关键工作流程
1.初始化阶段:
- 调用CreateDXGIFactory2获取DXGI工厂
- 枚举适配器与输出接口(EnumAdapters/EnumOutputs)
- 创建IDXGIOutputDuplication实例
2.捕获循环:
do {
DXGI_OUTDUPL_FRAME_INFO frameInfo;
hr = pDupl->AcquireNextFrame(INFINITE, &frameInfo, &pDesktopResource);
if (SUCCEEDED(hr)) {
ProcessFrame(pDesktopResource, frameInfo);
pDupl->ReleaseFrame();
}
} while (!bExit);
2. 元数据与增量更新机制
2.1 元数据结构详解
系统为每帧提供三类核心元数据:
1.脏矩形区域:
typedef struct _DXGI_OUTDUPL_DIRTY_RECTS {
RECT* pRects; // 脏矩形数组
UINT NumRects;// 数量
} DXGI_OUTDUPL_DIRTY_RECTS;
- 最大支持128个矩形区域
- 单次更新区域不超过屏幕总面积的30%
2.移动向量:
typedef struct _DXGI_OUTDUPL_MOVE_RECT {
POINT SourcePoint; // 源位置
RECT DestRect; // 目标区域
} DXGI_OUTDUPL_MOVE_RECT;
- 用于描述窗口拖动等块移动操作
3.光标信息:
- 包含形状数据(最大64x64像素,32位ARGB)
- 位置坐标(支持高DPI缩放)
2.2 增量更新优化算法
# 伪代码:差异区域处理优化
def process_frame(frame, metadata):
if metadata.dirty_rects:
for rect in metadata.dirty_rects:
if is_overlap(rect, previous_rects):
merge_rectangles()
else:
encode_region(rect)
if metadata.move_rects:
apply_motion_compensation()
update_cursor_position(metadata.cursor_info)
3. 性能优化关键技术
3.1 延迟敏感型处理
优化手段 | 效果提升 | 实现示例 |
---|---|---|
零拷贝路径 | 降低30% CPU占用 | 设置DXGI_USAGE_UNORDERED_ACCESS |
硬件加速编码 | 减少50%编码延迟 | 使用NVENC/QSV编码器 |
动态比特率调整 | 节省40%网络带宽 | 基于RTT的码率自适应算法 |
3.2 多显示器支持方案
1.跨GPU捕获:
// 使用DXGI_ADAPTER_FLAG_SOFTWARE适配器
pFactory->EnumWarpAdapter(IID_PPV_ARGS(&pAdapter));
2.异构显示器处理:
- 自动转换不同DPI显示器的坐标系统
- 支持HDR与SDR显示器混合环境
3.3 内存管理策略
1.环形缓冲区设计:
#define MAX_FRAMES 3
ID3D11Texture2D* frameBuffer[MAX_FRAMES]; // 三缓冲队列
2.显示到系统内存映射:
D3D11_MAPPED_SUBRESOURCE mapped;
pContext->Map(pStagingTex, 0, D3D11_MAP_READ, 0, &mapped);
memcpy(pDest, mapped.pData, bufferSize);
pContext->Unmap(pStagingTex, 0);
4. 安全与兼容性保障
4.1 数字版权管理
1.HDCP内容保护:
- 自动检测受保护内容(如Netflix流媒体)
- 触发黑屏处理机制(返回纯色矩形)
2.安全边界控制:
// 检测UAC保护窗口
if (IsWindowUIAccessProtected(hWnd)) {
return E_ACCESSDENIED;
}
4.2异常处理机制
错误代码 | 处理方案 |
---|---|
DXGI_ERROR_ACCESS_LOST | 重建Duplication接口 |
DXGI_ERROR_WAIT_TIMEOUT | 调整AcquireNextFrame超时参数 |
DXGI_ERROR_INVALID_CALL | 检查资源状态机一致性 |
5. 企业级部署方案
5.1 远程桌面服务优化
1.注册表配置:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"MaxCompressionLevel"=dword:00000002
"UseMonitorProfiles"=dword:00000001
2.组策略设置:
- 启用"计算机配置→管理模板→Windows组件→远程桌面服务→远程桌面会话主机→远程会话环境→使用硬件图形适配器"
5.2 工业控制系统
1.实时性保障:
// 设置线程优先级
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
SetProcessAffinityMask(GetCurrentProcess(), 0x01);
2.看板模式:
Set-DisplayResolution -Width 1920 -Height 1080 -Force -Confirm:$false
附录:开发资源与工具链
性能分析工具集:
工具名称 | 用途 | 关键指标 |
---|---|---|
Windows Performance Analyzer | 捕获DWM事件流 | 合成延迟、GPU占用率 |
NVIDIA Nsight | 分析GPU编码流水线 | 帧处理时间、显存带宽 |
Intel GPA | 优化媒体编码性能 | QSV编码器队列深度 |