Apple の新しい Metal フレームワークを使用して iOS アプリケーションを作成しています。MTLDevice.newBufferWithLength() メソッドを介してシェーダーに渡す必要があるMatrix4 オブジェクトの配列 ( Ray Wenderlich のチュートリアルを参照) があります。Matrix4 オブジェクトは Apple の GLKit を利用しています (これには GLKMatrix4 オブジェクトが含まれています)。
GPU 呼び出しでインスタンス化を利用しています。
後でこれをインスタンスごとにより多くのデータを含む構造体に変更します (Matrix4 オブジェクトだけではありません)。
[Matrix4] オブジェクトの配列をこのバッファに効率的にコピーするにはどうすればよいですか?
これを行うより良い方法はありますか?繰り返しますが、将来的にはより多くのデータを含む構造体を使用するようにこれを拡張します。
以下は私のコードのサブセットです:
let sizeofMatrix4 = sizeof(Float) * Matrix4.numberofElements()
// This returns an array of [Matrix4] objects.
let boxArray = createBoxArray(parentModelViewMatrix)
let sizeOfUniformBuffer = boxArray.count * sizeOfMatrix4
var uniformBuffer = device.newBufferWithLength(sizeofUniformBuffer, options: .CPUCacheModeDefaultCache)
let bufferPointer = uniformBuffer?.contents()
// Ouch - way too slow. How can I optimize?
for i in 0..<boxArray.count
{
memcpy(bufferPointer! + (i * sizeOfMatrix4), boxArray[i].raw(), sizeOfMatrix4)
}
renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, atIndex: 2)
注: boxArray[i].raw() メソッドは、Objective-C コードで次のように定義されています。
- (void *)raw {
return glkMatrix.m;
}
各配列オブジェクトをループしてから memcpy を実行していることがわかります。配列を連続したメモリのセットとして扱う際に問題が発生していたので、これを行いました。
ありがとう!