(少し遅れたが、まあ)
GPUは、高度な並列プロセッサであるので、あなたはそれが唯一のテクスチャで動作させることができる方法はありません:あなたは、単一のピクセルのために書いたあなたのカーネルがで呼び出されますすべてのピクセルで平行であれば、どのピクセルが最初に表示されるかはわかりません。
2つのテクスチャが必要です。おそらくそれを行うべき方法は、1つが「古い」もので、もう1つが「新しい」ものである2つのテクスチャを使用することです。パスの間で、テクスチャの役割を切り替えます。今は古いものが新しいもので、新しいものは古いものです。
var currentText = MTLTexture()
var nextText = MTLTexture()
let semaphore = dispatch_semaphore_create(1)
func update() {
dispatch_semaphore_wait(semaphore) // Wait for updating done signal
let commands = commandQueue.commandBuffer()
let encoder = commands.computeCommandEncoder()
encoder.setTexture(currentText, atIndex: 0)
encoder.setTexture(nextText, atIndex: 1)
encoder.dispatchThreadgroups(...)
encoder.endEncoding()
// When updating done, swap the textures and signal that it's done updating
commands.addCompletionHandler {
swap(¤tText, &nextText)
dispatch_semaphore_signal(semaphore)
}
commands.commit()
}
Time Profiler(計測器で)とGPUフレームキャプチャ(Xcodeで)でアプリをプロファイリングしましたか?リソースの割り当て、カーネルのコピー、実行にどれくらいの時間を費やしているかを判断することで、まず何を最適化するかを理解するのに役立ちます。 – warrenm
@warrenmお返事ありがとうございます。 「BlitCommandEncoder」で動作するルーチンが、遅延を引き起こした別の時間のかかる関数を呼び出していたことが判明しました.Blit操作は遅延の主要な原因ではありませんでした。それは私のせいでした。しかし、GPUフレームキャプチャを見て、私はBlit操作の持続時間について言及していないことを発見しました。(Compute操作とは対照的に) - これを測定する方法はありませんか? – sarasvati
現在、GPUフレームキャプチャで計算エンコーダの時間をキャプチャする方法はないと思います。 – warrenm