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を準備する

2. ビルドシステムのヘッダ検索パスにmetal-cppフォルダを追加する

Xcodeで以下の手順を実行します。

  • プロジェクトナビゲータをクリックします。
  • プロジェクトをクリックします。
  • 「Build Settings(ビルド設定)」をクリックします。
  • 「Header Search Paths」を検索します。
  • 抽出したフォルダにパスmetal-cpp/を追加します。 Xcodeでパスを入力しているスクリーンショット
  • 「C++ Language Dialect」を検索し、C++17以降に設定されていることを確認します。 Xcodeで設定がハイライトされているスクリーンショット
  • 「Build Phases(ビルドフェーズ)」タブで、リンクするフレームワークのリストに、Foundation、QuartzCore、Metalの各フレームワークを追加します。 Xcodeでライブラリがハイライトされているスクリーンショット

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ファイルを参照してください。