菜单

平台抽象层

相关源文件

OBS Studio 中的平台抽象层 (PAL) 为 Windows、macOS 和 Linux 上的平台特定操作提供了统一的接口。此层使核心应用程序代码能够通过一致的 API 与平台特定功能交互,从而抽象出操作系统之间的底层差异。

有关特定平台实现的更多信息,请参阅 libobs 目录中操作系统特定的文件,例如 obs-windows.c obs-cocoa.mobs-nix.c

架构概述

平台抽象层位于 OBS 核心组件和底层操作系统之间,为平台特定功能提供一致的抽象。

来源:libobs/util/platform.h libobs/util/platform-windows.c libobs/util/platform-nix.c libobs/util/platform-cocoa.m

关键组件和功能

平台抽象层提供了以下关键功能组

来源:libobs/util/platform.h16-223

文件和目录操作

PAL 提供了跨平台一致支持 UTF-8 的文件和目录操作函数

功能组关键函数描述
文件操作os_fopen, os_wfopen, os_fgetsize打开和读取文件
文件内容os_fread_utf8, os_quick_read_utf8_file支持 UTF-8 读取文件内容
目录操作os_opendir, os_readdir, os_closedir导航目录
文件系统操作os_mkdir, os_rmdir, os_unlink, os_rename修改文件系统
路径工具os_get_abs_path, os_get_path_extension路径操作

来源:libobs/util/platform.h33-58 libobs/util/platform.h112-166

动态库加载

PAL 最重要的功能之一是加载平台特定的动态库(Windows 上的 DLL、Linux 上的 .so 文件以及 macOS 上的 .dylib 文件或 bundles)

来源:libobs/util/platform-windows.c65-135 libobs/util/platform-nix.c68-111 libobs/util/platform-cocoa.m

系统计时和信息

PAL 提供了计时功能和系统信息检索的一致性

功能描述Windows 实现Unix/Linux 实现macOS 实现
os_gettime_ns高精度时间戳QueryPerformanceCounterclock_gettimeclock_gettime_nsec_np
os_sleep_ms休眠毫秒Sleepusleepusleep
os_sleepto_ns休眠至时间戳QueryPerformanceCounter + Sleepnanosleepnanosleep
os_get_physical_cores获取物理 CPU 核心数PSYSTEM_LOGICAL_PROCESSOR_INFORMATION/proc/cpuinfo 解析sysctl machdep.cpu.core_count
os_get_logical_cores获取逻辑 CPU 核心数PSYSTEM_LOGICAL_PROCESSOR_INFORMATIONsysconf(_SC_NPROCESSORS_ONLN)sysctl machdep.cpu.thread_count

来源:libobs/util/platform-windows.c401-459 libobs/util/platform-nix.c221-263 libobs/util/platform-cocoa.m41-44 libobs/util/platform-windows.c1259-1327 libobs/util/platform-nix.c845-987 libobs/util/platform-cocoa.m312-342

路径管理

PAL 处理配置和应用程序数据的平台特定路径管理

来源:libobs/util/platform-windows.c460-541 libobs/util/platform-nix.c274-434 libobs/util/platform-cocoa.m47-134

特定平台实现

Windows 实现

Windows 实现广泛使用 Win32 API

  • 动态库:使用 LoadLibraryGetProcAddressFreeLibrary
  • 文件操作:使用 Windows 特定的文件函数进行 UTF-16 转换
  • 系统信息:使用 Windows 管理规范 (WMI) 和注册表查询
  • 进程管理:使用 SetThreadExecutionState 来阻止系统休眠

来源:libobs/util/platform-windows.c libobs/obs-windows.c

Unix/Linux 实现

Linux/Unix 实现主要使用符合 POSIX 标准的函数

  • 动态库:使用 dlopendlsymdlclose
  • 文件操作:使用标准的 POSIX 文件函数
  • 系统信息:解析 /proc 并在 BSD 系统上使用 sysctl
  • 进程管理:使用 xdg-screensaver 或 D-Bus 来阻止系统休眠

来源:libobs/util/platform-nix.c libobs/obs-nix.c libobs/obs-nix-x11.c

macOS 实现

macOS 实现使用 Cocoa 和 Core Foundation

  • 动态库:使用 dlopendlsymdlclose,并对框架进行特殊处理
  • 文件操作:使用标准的 POSIX 文件函数和 Cocoa 扩展
  • 系统信息:使用 sysctl 获取系统信息
  • 进程管理:使用 IOPMAssertionCreate 来阻止系统休眠

来源:libobs/util/platform-cocoa.m libobs/obs-cocoa.m

OBS Studio 中的使用

平台抽象层主要用于 OBS Studio 的以下关键领域

  1. 插件加载:加载平台特定的模块和插件
  2. 文件管理:读取和写入配置文件及数据
  3. 系统信息:收集系统信息用于诊断
  4. 性能监控:编码/推流期间的 CPU 使用率跟踪
  5. 线程管理:跨平台线程同步

加载插件的示例用法

来源:libobs/obs-internal.h libobs/obs-module.c

UI 和快捷键的平台抽象

平台抽象层还为平台特定的 UI 相关功能(尤其是快捷键)提供了抽象

来源:libobs/obs-windows.c369-1006 libobs/obs-nix.c418-495 libobs/obs-cocoa.m219-966 libobs/obs-nix-x11.c77-1290

扩展平台抽象层

当向 OBS 添加需要平台特定实现的新功能时

  1. platform.h 中定义通用接口
  2. 针对每个平台进行实现
    • Windows:platform-windows.c
    • Linux/Unix:platform-nix.c
    • macOS:platform-cocoa.m

对于不适合通用抽象的平台特定功能,请使用平台特定文件

  • Windows:obs-windows.c
  • Linux:obs-nix.cobs-nix-x11.c
  • macOS:obs-cocoa.m

来源:libobs/util/platform.h libobs/obs-internal.h