メタルシェイダーには、さまざまなトレードオフを持つスタティックライブラリを提供する方法はたくさんあります。ここでそれらを列挙しようとします。
1).metalファイルを静的ライブラリに焼き付けられた静的な文字列に変換します。
これはおそらく最悪のオプションです。アイデアは、静的ライブラリの文字列リテラルとして含まれる文字列にMetalシェーダコードを前処理することです。その後、newLibraryWithSource:options:error:
API(またはその非同期兄弟)を使用して、ソースをMTLLibrary
に変換し、関数を取得します。これには、.metal
から文字列への変換を行うプロセスを工夫する必要があり、シェーダのプリコンパイルの利点が失われ、結果として生じるアプリケーションが遅くなります。それはユーザーの負担の多くの場所とかかわら
2)船・金属あなたの静的ライブラリと一緒にファイルとは、そのアプリのターゲットに考えられ
すべてのものを、それらを追加するには、ライブラリのユーザーを必要とします。これは、まともなオプションがあり、 Metal Shaderのソースが公開されています(問題がある場合)。静的ライブラリのコードは、Xcodeによって自動的にアプリケーションのdefault.metallib
にコンパイルされるため、「デフォルトライブラリ」(newDefaultLibrary
)を使用できます。これはリソースとしてアプリケーションバンドルに組み込まれています。
3)は、それはあなたのシェーダのソースを公開していないので、これは、(のみそのIRの使いやすさ、パフォーマンス、およびセキュリティの間の良好な妥協点であるあなたの静的ライブラリと一緒に
を.metallibファイルを出荷します)。基本的には、プロジェクトに "Metal Library"ターゲットを作成し、シェーダコードを配置することができます。これにより、.metallib
ファイルが生成されます。このファイルは、静的ライブラリと共に出荷され、ユーザーがアプリケーションターゲットにリソースとして埋め込むことができます。静的ライブラリは、実行時にnewLibraryWithData:error:
またはnewLibraryWithURL:error:
APIを使用して.metallib
をロードできます。シェーダはあらかじめコンパイルされているので、ライブラリを作成する方が高速になり、コンパイル時の診断の利点が得られます。
あなたがうまくいくアプローチを見つけたらうれしいです。後世のために、私は以下にコメントし、1つのファイルだけを出荷している間にシェーダのプリコンパイルの利点を維持できる概念実証プロジェクトを共有しました。私がこれをプロダクションでやっていたのなら、ほぼ確実に私が取るアプローチです。 – warrenm