菜单

游戏捕获

相关源文件

游戏捕捉是 OBS Studio 中一种特殊的捕捉方法,它直接挂钩游戏的图形渲染管线,以最小的性能影响高效捕捉画面。与使用标准 Windows API 的窗口捕捉(窗口与显示器捕捉)不同,游戏捕捉会将图形钩子库注入目标游戏进程,直接从图形 API 拦截渲染的画面。

概述

游戏捕捉通过将钩子库注入目标游戏进程,并拦截对 Direct3D (8/9/10/11/12)、OpenGL 和 Vulkan 等图形 API 的调用来工作。这使得 OBS 能够在画面呈现到屏幕之前直接从图形渲染管线捕捉画面,从而与其他捕捉方法相比开销更低。

该系统由两个主要组件组成

  1. 游戏捕捉源:作为 OBS 源插件实现,负责处理配置、进程注入和接收捕捉到的画面
  2. 图形钩子:一个注入游戏进程的 DLL,用于挂钩图形 API 函数并将捕捉到的画面发送回 OBS

捕捉架构图

来源:plugins/win-capture/game-capture.c plugins/win-capture/graphics-hook/graphics-hook.c

捕捉方法

游戏捕捉支持两种主要方法,用于将捕捉到的画面从游戏进程传输到 OBS

  1. 共享纹理 (shtex):使用游戏进程和 OBS 都可以访问的共享纹理句柄。这种方法效率更高,但需要兼容的硬件和驱动程序。
  2. 共享内存 (shmem):将画面数据复制到共享内存缓冲区。这种方法兼容性更好,但效率可能较低。

方法选择基于硬件支持,在可用时优先使用共享纹理,除非通过配置强制使用共享内存。

来源:plugins/win-capture/game-capture.c425-448 plugins/win-capture/graphics-hook/graphics-hook.c542-573

捕捉模式

游戏捕捉提供三种不同的捕捉模式

模式描述配置
任意全屏捕捉当前处于焦点状态的任意全屏应用程序默认模式,自动检测全屏应用程序
指定窗口按标题、类或可执行文件捕捉指定窗口用户从下拉菜单或窗口选择器中选择窗口
热键仅在通过热键激活时捕捉需要用户按下热键才能开始/停止捕捉

来源:plugins/win-capture/game-capture.c91-92 plugins/win-capture/game-capture.c423-437

挂钩过程

挂钩过程是游戏捕捉的关键部分,涉及多个步骤

来源:plugins/win-capture/game-capture.c1004-1061 plugins/win-capture/game-capture.c878-898 plugins/win-capture/graphics-hook/graphics-hook.c402-417

图形 API 支持

钩子库尝试检测并挂钩目标进程中的多个图形 API

挂钩架构

来源:plugins/win-capture/graphics-hook/graphics-hook.c302-401 plugins/win-capture/graphics-hook/d3d9-capture.cpp plugins/win-capture/graphics-hook/dxgi-capture.cpp plugins/win-capture/graphics-hook/gl-capture.c plugins/win-capture/graphics-hook/vulkan-capture.c

配置选项

游戏捕捉提供多种配置选项以自定义捕捉行为

选项描述默认
模式捕捉模式(任意全屏、指定窗口、热键)任意全屏
窗口在使用指定窗口模式时指定目标窗口-
SLI/Crossfire 兼容性强制共享内存捕捉关闭
捕捉鼠标光标捕捉鼠标光标
允许透明度允许捕捉到的画面具有透明度关闭
限制捕捉帧率限制捕捉速率以减少资源占用关闭
捕捉叠加层捕捉第三方叠加层(Steam、Discord 等)关闭
反作弊兼容性挂钩使用侵入性较低但兼容性更好的挂钩方法
挂钩速率搜索游戏进程的积极程度普通用户

来源:plugins/win-capture/game-capture.c30-44 plugins/win-capture/game-capture.c98-114

共享内存 vs. 共享纹理

游戏捕捉使用两种不同的方法将捕捉到的画面从游戏进程传输到 OBS

数据流图

共享内存方法

  • 使用系统内存在进程间复制画面数据
  • 与各种硬件和软件配置的兼容性更好
  • 需要进行 CPU 到 GPU 的传输,这可能会较慢
  • 在不支持共享纹理或启用兼容模式时使用

共享纹理方法

  • 直接使用 GPU 内存并进行硬件加速
  • 效率更高,因为它避免了 CPU 到 GPU 的传输
  • 需要兼容的硬件和图形驱动程序
  • 硬件支持时的默认方法

来源:plugins/win-capture/game-capture.c776-807 plugins/win-capture/graphics-hook/graphics-hook.c520-570 plugins/win-capture/graphics-hook/graphics-hook.c709-763

反作弊注意事项

游戏捕捉对于带有反作弊系统的游戏有特殊考虑

  1. 黑名单进程:某些应用程序(浏览器、启动器、系统工具)被列入黑名单,无法捕捉,以防止出现问题。
  2. 反作弊兼容模式:对于带有反作弊系统的游戏,使用侵入性较低的挂钩方法。
  3. 注入方法:基于安全考虑,采用不同的注入技术(直接注入 vs. 辅助进程注入)。

代码中包含安全措施,以防止挂钩不兼容的应用程序,这可能导致带有严格反作弊系统的游戏崩溃或封号。

来源:plugins/win-capture/game-capture.c956-996 plugins/win-capture/game-capture.c942-947 plugins/win-capture/game-capture.c200-201

进程间通信

游戏捕捉使用多种机制在 OBS 和被挂钩的游戏进程之间进行通信

  1. 命名事件:用于进程间的信号传递(就绪、退出、重启等)
  2. 共享内存映射:用于配置数据和画面数据传输
  3. 互斥锁:用于同步对共享资源的访问
  4. 命名管道:用于日志记录和诊断信息

该系统依赖于 Windows 特定的 IPC 机制来建立和维护独立进程之间的通信。

来源:plugins/win-capture/game-capture.c195-213 plugins/win-capture/graphics-hook/graphics-hook.c99-129 plugins/win-capture/graphics-hook/graphics-hook.c520-570

限制与兼容性

游戏捕捉具有一定的限制和兼容性考量

  1. 图形 API 支持:仅支持 DirectX 8/9/10/11/12、OpenGL 和 Vulkan
  2. 反作弊系统:可能不适用于具有严格反作弊措施的游戏
  3. UWP 应用程序:对通用 Windows 平台应用的支持有限
  4. 管理员权限:可能需要以管理员身份运行 OBS 才能注入某些游戏
  5. 多 GPU 系统:多 GPU 设置(SLI/Crossfire)可能存在问题,除非启用兼容模式

来源:plugins/win-capture/game-capture.c956-996 plugins/win-capture/game-capture.c436-447

故障排除与性能

当游戏捕捉无法挂钩或捕捉游戏时,系统提供多种备用机制

  1. 挂钩速率设置:控制 OBS 尝试查找和挂钩游戏的积极程度
  2. 兼容模式:强制对有问题游戏使用共享内存捕捉
  3. 自动重试:如果初始尝试失败,系统将定期重试挂钩
  4. 日志记录:详细的日志记录有助于诊断捕捉问题

性能考量包括

  • 共享纹理捕捉通常比共享内存捕捉更高效
  • 限制捕捉帧率可以减少资源占用
  • 捕捉叠加层可能会影响某些游戏的性能

来源:plugins/win-capture/game-capture.c296-310 plugins/win-capture/game-capture.c757-774