我有一個MPSImageGaussianBlur
對象在計算傳遞的每一幀上進行工作(模糊中間紋理的內容)。渲染管道中的MPSImageGaussianBlur
雖然該應用程序仍以60fps運行沒有問題,但啓用模糊通行證後,CPU使用率增加了約15%。我想知道這是否正常?
我只是好奇MPSImageGaussianBlur
的encodeToCommandBuffer:
操作將會看到如此多的CPU利用率。在我的(雖然幼稚)的理解,我想有也只是沿着線的一些簡單的編碼:
MPSImageGaussianBlur.encodeToCommandBuffer:
僞方法:
func encodeToCommandBuffer(commandBuffer: MTLCommandBuffer, sourceTexture: MTLTexture, destinationTexture: MTLTexture) {
let encoder = commandBuffer.computeCommandEncoder()
encoder.setComputePipelineState(...)
encoder.setTexture(sourceTexture, atIndex: 0)
encoder.setTexture(destinationTexture, atIndex: 1)
// kernel weights would be built at initialization and
// present here as a `kernelWeights` property
encoder.setTexture(self.kernelWeights, atIndex: 2)
let threadgroupsPerGrid = ...
let threadsPerThreadgroup = ...
encoder.dispatchThreadgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
encoder.endEncoding()
}
大部分的性能魔法'將在計算內核函數中運行的算法上實現。我可以理解這一點,因爲性能(在GPU上)非常棒,獨立於blurRadius,我初始化了MPSImageGaussianBlur
。
關於我的具體設置一些可能不相關的細節:
MPSImageGaussianBlur
與模糊半徑8像素初始化。- 我模糊的紋理是128乘128像素。
- 在MTKViewDelegate的
drawInMTKView:
方法中執行所有渲染。
我希望這個問題有點清楚,它的意圖。
可以肯定的是,您只是創建了一個'MPSImageGaussianBlur'實例,然後跨幀複用它,是否正確? – warrenm
是的,只是一個實例 – jameslintaylor
哪個設備和iOS版本是你看到的這種行爲? – warrenm