Metal-cppの概要
Metal-cppは、Metal用の低オーバーヘッドのC++インターフェイスです。Metal-cppを使えば、C++で記述されているグラフィックスアプリやゲーム、ゲームエンジンにMetalの機能を追加できます。
特徴
- Metal Objective-Cヘッダに対するドロップインのC++代替インターフェイス。
- Metal Objective-Cクラス、定数、列挙型のMTL C++名前空間のC++へのダイレクトマッピング。
- C++関数呼び出しのインライン展開によってもたらされる、Metal Objective-Cヘッダの呼び出しと比較しても遜色のないオーバーヘッド。
- 追加の割り当てを必要とするラッパーコンテナの不使用。
- iOS、iPadOS、macOS、tvOSにおける同一のヘッダファイルおよび関数/定数/列挙型の利用。
- 後方互換性:すべての
bool MTL::Device::supports...()
関数における必要なセレクタの存在チェックによる、存在しない場合の自動的なfalse
の返却。 - 文字列
(ErrorDomain)
定数のweakリンクによる、利用可能でない場合の自動的なnullptr
のセット。
インストール手順
1. Macを準備する
- MacでXcodeを開きます。Xcode 9.3以降にはC++17が付属しています。
NS::Object
でconstexpr
が使用されているため、これが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で以下の手順を実行します。
- プロジェクトナビゲータをクリックします。
- プロジェクトをクリックします。
- 「Build Settings(ビルド設定)」をクリックします。
- 「Header Search Paths」を検索します。
- 抽出したフォルダにパス
metal-cpp/
を追加します。 - 「C++ Language Dialect」を検索し、C++17以降に設定されていることを確認します。
- 「Build Phases(ビルドフェーズ)」タブで、リンクするフレームワークのリストに、Foundation、QuartzCore、Metalの各フレームワークを追加します。
3. 実装を生成する
metal-cppはヘッダのみのライブラリです。実装を生成するには、1つの.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、MTLまたはCA _PRIVATE_IMPLEMENTATIONマクロは1回だけ定義してください。
Metal-cppの代替単一ヘッダ
便利な方法として、metal-cppを単一ヘッダインクルードとしてプロジェクトで使用することもできます。
ZIPファイルの内容を抽出した後、ターミナルで次のコマンドを実行して単一のインクルードヘッダを生成します。
./SingleHeader/MakeSingleHeader.py Foundation/Foundation.hpp QuartzCore/QuartzCore.hpp Metal/Metal.hpp
コマンドの実行が完了すると、./SingleHeader/Metal.hpp
という単一ファイルが生成されます。このファイルには、プロジェクトでmetal-cppを使用するために必要なものすべてが含まれています。
必ず、1つのCPPファイルで実装を生成するようにしてください。
#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Metal/Metal.hpp>
メモリ管理に関する注意事項
Metal-cppは、CocoaおよびCocoa Touchのオブジェクト割り当てポリシーに従います。C++オブジェクトはAutomatic Reference Counting(ARC:自動参照カウント)の対象ではないため、metal-cppの使用にあたり、これらのルールを理解しておくことが特に重要です。詳しくは、metal-cppダウンロードに含まれるRead Meファイルを参照してください。