dx为什么用com

1. DirectX 的历史背景

  • DirectX 是 90 年代微软为 Windows 游戏/多媒体开发出的 API。

  • 当时 Windows 上最通用的组件化技术就是 COM(Component Object Model)

  • DirectX 各子系统(D3D、DirectSound、DirectInput 等)都需要:

    • 统一接口规范

    • 二进制兼容性(应用程序不需要重新编译即可使用新版本的 DLL)

    • 跨语言调用(VB、C++、Delphi 都能用)

👉 COM 正好满足这些需求。


2. COM 的几个特点

  • 接口基于虚函数表(vtable),类似 C++ 的纯虚类 (struct IUnknown { virtual HRESULT QueryInterface(...)=0; ... })。

  • 引用计数(AddRef / Release) 统一管理对象生命周期,避免资源泄漏。

  • 接口可扩展:旧程序不需要改动就能加载新 DLL(只要接口兼容)。

  • 二进制标准化:调用规则固定,可以跨编译器、跨语言使用。


3. 为什么 DirectX 用 COM?

(1) 模块化和可扩展

DirectX 需要很多子系统,显卡驱动、声音驱动、输入设备厂商都要写插件式的实现。
👉 COM 的接口模型使 驱动厂商实现接口,应用层直接调用,不需要关心底层实现。

(2) 版本兼容

游戏对性能和兼容性要求极高。

  • 用 COM,接口一旦发布,二进制就固定了;

  • DirectX 可以在新版本里扩展接口,而不会破坏旧游戏。

(3) 跨语言调用

早期很多 Windows 应用并不是 C++ 写的(VB、Delphi 占不少份额),COM 让它们也能调用 DirectX。

(4) 生命周期管理

显卡资源很宝贵(纹理、缓冲区、设备对象),需要精细控制释放时机。
👉 COM 的引用计数机制简化了这一点。


4. 为什么 DirectX 12 就不再强制用 COM?

  • DX12 是低层 API,更接近 Vulkan。

  • 仍然基于 COM 接口(IUnknown),但用得更“轻”:

    • 很多地方直接给你结构体和函数调用,不再层层封装。

    • 目的就是减少 COM 的开销,追求性能。


总结一句话
DirectX 用 COM,是因为当年需要 跨语言、二进制兼容、驱动厂商可扩展、统一生命周期管理
它是历史背景下的必然选择。后来 DX12 虽然简化,但依旧基于 COM 的核心模型。

posted on 2025-10-07 23:13  lydstory  阅读(3)  评论(0)    收藏  举报

导航