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。

2. 将 metal-cpp 文件夹添加到构建版本系统的头文件搜索路径中。

在 Xcode 中:

  • 点按“Project Navigator”(项目导航器)。
  • 点按所需项目。
  • 点按“Build Settings”(构建版本设置)。
  • 搜索“Header Search Paths”(头文件搜索路径)。
  • 将路径添加到已解压的文件夹:metal-cpp/ Xcode 截屏,其中显示了所输入的路径
  • 搜索“C++ Language Dialect”,并确保将其设置为 C++17 或更高版本。 Xcode 截屏,其中高亮显示了设置
  • 请务必将 Foundation、QuartzCore 和 Metal 框架添加到“Build Phases”(构建版本阶段) 标签页下要链接的框架列表中。 Xcode 截屏,其中高亮显示了开发库

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_IMPLEMENTATIONCA_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 文件。