Metal-cpp 入门
Metal-cpp 是适用于 Metal 的低开销 C++ 接口,可帮助你将 Metal 功能添加到以 C++ 语言编写的图形类 App、游戏和游戏引擎中。
亮点
- 使用 C++ 接口替代 Metal 的 Objective-C 头文件。
- 直接映射所有 Metal Objective-C 类、常量和枚举到 C++ 的 MTL 名字空间中。
- 由于使用了 C++ 内联函数调用,因此相较于使用 Metal 的 Objective-C 头文件,无显著开销。
- 没有使用需要额外内存分配的封装容器类。
- 为 iOS、iPadOS、macOS 和 Apple tvOS 提供完全相同的头文件和函数/常量/枚举。
- 向后兼容:所有
bool MTL::Device::supports...()
函数都会检查其所需的 Selector 是否存在;如果不存在,则自动返回false
。 - 字符串
(ErrorDomain)
常量为弱链接,在不可用时会自动设置为nullptr
。
安装说明
1. 准备好 Mac。
- 在你的 Mac 上打开 Xcode。需要支持 C++17 的 Xcode 9.3 或更高版本;由于
NS::Object
中使用了constexpr
,因此 C++17 是 Metal-cpp 的最低要求。 - 下载以下 ZIP 文件并提取其中的内容。
metal-cpp_macOS15_iOS18.zip
metal-cpp_macOS15_iOS18-beta.zip
metal-cpp_macOS14.2_iOS17.2.zip
metal-cpp_macOS14_iOS17-beta.zip
metal-cpp_macOS13.3_iOS16.4.zip
metal-cpp_macOS13_iOS16.zip
metal-cpp_macOS12_iOS15.zip
2. 将 metal-cpp 文件夹添加到构建版本系统的头文件搜索路径中。
在 Xcode 中:
- 点按“Project Navigator”(项目导航器)。
- 点按所需项目。
- 点按“Build Settings”(构建版本设置)。
- 搜索“Header Search Paths”(头文件搜索路径)。
- 将路径添加到已解压的文件夹:
metal-cpp/
。 - 搜索“C++ Language Dialect”,并确保将其设置为 C++17 或更高版本。
- 请务必将 Foundation、QuartzCore 和 Metal 框架添加到“Build Phases”(构建版本阶段) 标签页下要链接的框架列表中。
3. 生成实现代码。
metal-cpp 是一个只包含头文件的开发库。要生成实现代码,请在你的任意一个 .cpp 文件中添加以下代码:
#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Foundation/Foundation.hpp>
#include <Metal/Metal.hpp>
#include <QuartzCore/QuartzCore.hpp>
注:也可以将 metal-cpp 头文件放在引号中。
4. 使用 metal-cpp。
在任何需要引用 metal-cpp 对象或类型的文件中,只需包含头文件即可让那些符号可见。
#include <Foundation/Foundation.hpp>
#include <Metal/Metal.hpp>
#include <QuartzCore/QuartzCore.hpp>
重要信息:NS_PRIVATE_IMPLEMENTATION、MTL_PRIVATE_IMPLEMENTATION 和 CA_PRIVATE_IMPLEMENTATION 宏只能定义一次。
单个头文件的 Metal-cpp
为方便操作,你还可以在项目中以单个头文件的形式来包含 metal-cpp。
在提取 ZIP 文件内容后,请从终端运行以下命令以生成单个用来包含的头文件。
./SingleHeader/MakeSingleHeader.py Foundation/Foundation.hpp QuartzCore/QuartzCore.hpp Metal/Metal.hpp
运行完成后,这个命令会生成单个头文件:./SingleHeader/Metal.hpp。
这个文件中包含你在项目中使用 metal-cpp 所需的一切。
请记得在一个 CPP 文件中生成实现代码。
#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Metal/Metal.hpp>
内存管理注意事项
Metal-cpp 遵循 Cocoa 和 Cocoa Touch 的对象分配策略。了解这些规则对于使用 metal-cpp 尤其重要,因为 C++ 对象不符合自动引用计数 (ARC) 的条件。有关更多信息,请参考 metal-cpp 下载项中的 README 文件。