個人メモ
週末の2日を全部潰してMetalの練習をしました。大いなる無駄だったと思うけど、知識は増えました。
スタート地点
http://www.raywenderlich.com/77488/ios-8-metal-tutorial-swift-getting-started
このページにあるHelloMetal
私の個人的結論から
2Dのスプライトを動かすだけならほとんどの場合、SpriteKitで大丈夫です。
確かにメタルは速い
確かにメタルは速いです。iPone6 iPad2の両方で200個のスプライトを描いてもフレーム速度は60FPSを維持します。とにかく高速だけを求めるならメタルはスプライトキットの敵ではありません。
3D用のフレームワーク
それでも、3D用のフレームワークです
HelloMetalから、2Dのスプライトを動かすための基本部分を次に抜き書きします。これは先のHelloMetalを少しだけ拡張してまとめたものです
Metalのコードをまとめてみました。自家製の部分は自家製のスプライト作成コードがありますので、無視してください。
ハマった点
メモリーリーク
元のコードのままでは、メモリーリークが発生します。描画が終わらないうちに、次のバッファの処理を始めるからです。それを防ぐためにコンプリーションハンドラを使ってセマフォーで処理終了まで次の処理に入らないようにしました。
シェーダー
別の記事にソースコードを記載しています。
http://qiita.com/Kumaa/items/e4cf44e9221f70a0c13c
結論
むだにエネルギーを使ったなあというのが感想です。Metalは速度がクリティカルな3D用のフレームワークです。もう少し2Dでも使いやすいと良いです。
ここに書いていない処理で必要なのは、テクスチャを頂点配列に貼り付ける作業です。XCASSETに画像を入れてUIImageのnamedでとってくれば簡単にできると思います。
私の感想としては、現在の処理方法でもスプライトキットの5倍の処理速度だとおもいます。でもたった5倍という話もあります。エンコードしたバッファの再利用は現時点ではしていません。エンコードしたバッファを再利用することで、さらに処理速度が上がるということです。速度の向上は可能のようです。