← 全部文章
工程笔记

游戏采集 & 窗口采集

本文目录

1.1 图形 API

Windows 系统的图形 API(Graphics Application Programming Interface)是软件接口,用于开发者创建和管理图形内容。相当于桥接层,在应用程序与底层硬件之间提供了一层抽象,开发者无需操作硬件接口即可进行图形绘制。

  1. GDI (Graphics Device Interface):Windows 最基础的 2D 绘图接口,依赖CPU渲染,性能有限,主要供传统桌面应用使用。

  2. GDI+:GDI 的增强版,支持抗锯齿、透明度、复杂几何与高级文本渲染,仍以软件为主。

  3. Direct2D:面向 2D 的硬件加速 API,性能优于 GDI/GDI+,适合高性能绘图场景。

  4. Direct3D:DirectX 3D 渲染接口,广泛应用于游戏与高性能多媒体。

  5. OpenGL:跨平台的 2D/3D API,在 Windows 上通过驱动支持,多用于专业图形与部分游戏。

  6. WPF (Windows Presentation Foundation):.NET 框架基于矢量的 UI 子系统,内置动画、样式与硬件加速,适合快速构建现代桌面应用。

  7. Vulkan:Khronos Group 提供的低开销、跨平台图形/计算 API,面向极致性能和细粒度控制。

2. 游戏进程采集

  • 原理:通过 DLL 注入到目标进程,拦截 DirectX/OpenGL/Vulkan 图形调用,获取 GPU 帧缓冲数据并共享给采集软件。

  • 优点:

    • 高性能、低延迟:可直接拦截 GPU 渲染调用,无需往返 CPU,帧率与 GPU 渲染同步。
    • 专门针对游戏优化:支持全屏独占模式和硬件加速特性,兼容 DX9/10/11/12、OpenGL、Vulkan 主流游戏。
  • 缺点:

    • 兼容性差:对普通桌面应用(GDI/GDI+ 渲染)无法工作,对 Electron(Chromium/Skia 多进程沙箱)也难以插入钩子。
    • 安全与稳定风险:注入机制可能被杀软、反作弊系统拦截,甚至引发目标程序崩溃。
    • 维护成本:需不断适配新游戏引擎、API 版本与系统安全策略。

3. 窗口采集

WinRT 原生捕获

  • 原理:基于 Windows.Graphics.Capture API,通过 DWM(桌面窗口管理器)与 DXGI Desktop Duplication,共享 GPU 纹理捕获特定窗口或屏幕。

  • 优点:

    • 跨 GPU:即使 OBS 与目标窗口处于不同 GPU,仍能捕获。
    • 低延迟、高性能:直接共享 GPU 纹理,无需拷贝到 CPU,适合动态内容。
  • 缺点:

    • 仅支持 Win10 1803+ 以上系统:旧版 Windows 10 或 Win7 无法使用。
    • 部分 Vulkan/DX12 游戏兼容性不足:部分全屏专属渲染可能无法捕获。

GDI BitBlt

  • 原理:使用 GDI BitBlt 函数将源 DC 像素块拷贝到目标 DC,兼容旧版 Windows。

  • 优点:

    • 兼容性好:Win7 及更早版本皆支持;无需额外权限或用户交互。
    • 实现简单:仅依赖 GDI 接口,易于移植。
  • 缺点:

    • 无法捕获硬件加速窗口:GPU 绘制绕过 GDI 管道,导致黑屏或花屏。
    • 高 CPU 开销、延迟大:需将 GPU 数据同步拷贝到 CPU,帧率 & 性能受限。

Magnification API

  • 原理:创建放大镜窗口,通过 MagSetWindowFilterList 筛选目标窗口,再从放大镜 DC 读取画面。

  • 优点:

    • 可捕获后台或被遮挡窗口:绕过 Z 顺序限制,适合隐藏窗口录制。
    • 支持硬件加速内容:DWM 合成后仍可读取渲染结果。
  • 缺点:

    • 帧率 & 性能开销高:放大镜合成与回读频繁,CPU/GPU 占用率高。
    • 依赖 Aero/DWM:在禁用 Aero 或使用第三方主题时可能失效。

4. 使用建议

  1. 高性能游戏场景,优先选用游戏进程采集,其次 WGC,二者性能相差不大;WGC 无注入,安全性更好。

  2. 若有支持老系统和兼容性的需求,再考虑使用 BitBlt 与 Magnification API。