我正在使用金属性能着色器(MPSImageHistogram
)来计算MTLBuffer
我抓取的东西,执行计算,然后通过MTKView
. 着色器的MTLBuffer
输出很小(~4K 字节)。所以我MTLBuffer
为每个渲染通道分配一个新对象,每个视频帧每秒至少有 30 个渲染。
calculation = MPSImageHistogram(device: device, histogramInfo: &histogramInfo)
let bufferLength = calculation.histogramSize(forSourceFormat: MTLPixelFormat.bgra8Unorm)
let buffer = device.makeBuffer(length: bufferLength, options: .storageModeShared)
let commandBuffer = commandQueue?.makeCommandBuffer()
calculation.encode(to: commandBuffer!, sourceTexture: metalTexture!, histogram: buffer!, histogramOffset: 0)
commandBuffer?.commit()
commandBuffer?.addCompletedHandler({ (cmdBuffer) in
let dataPtr = buffer!.contents().assumingMemoryBound(to: UInt32.self)
...
...
}
我的问题-
每次使用都可以创建一个新缓冲区
device.makeBuffer(..)
,还是更好地静态分配几个缓冲区并实现重用这些缓冲区?如果重用更好,我们如何在这些缓冲区上同步 CPU/GPU 数据写入/读取?另一个不相关的问题,可以在
MTKView
非主线程上绘制结果吗?还是MTKView
只能在主线程中进行绘制(即使我读到 Metal 是真正的多线程)?