【发布时间】:2018-10-17 05:14:13
【问题描述】:
我正在使用金属性能着色器 (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的结果吗?或者MTKViewdraws 只能在主线程中(即使我读过 Metal 是真正的多线程)?
【问题讨论】:
标签: ios metal metalkit metal-performance-shaders mtlbuffer