我嘗試使用蘋果公司和自定義compute Shaders
給定的默認MPSKernal
過濾器通過金屬應用實時相機過濾器。當我在金屬中使用自定義計算着色器時發生內存泄漏
我使用默認和自定義內核函數的組合在網格中的集合視圖上應用自定義過濾器。
它看起來像在應用程序剪輯。
但我觀察到的是,使用自定義過濾器有很多的memory leaks
相比,蘋果給出的默認核心功能。
我不知道我犯了什麼錯誤,但如果有的話。
這是我的自定義計算着色器。
kernel void customFunction1(
texture2d<float, access::read> inTexture [[texture(0)]],
texture2d<float, access::write> outTexture [[texture(1)]],
uint2 gid [[thread_position_in_grid]]){
const float4 colorAtPixel = inTexture.read(gid);
const float4 outputColor = float4(colorAtPixel.r, colorAtPixel.g, colorAtPixel.b, 1);
outTexture.write(outputColor, gid);
}
關於我通過線程組創建我的管路和調度的代碼放在這裏
let blur = MPSImageGaussianBlur(device: device, sigma: 0)
let threadsPerThreadgroup = MTLSizeMake(4, 4, 1)
let threadgroupsPerGrid = MTLSizeMake(destinationTexture.width/threadsPerThreadgroup.width, destinationTexture.height/threadsPerThreadgroup.height, 1)
let commandEncoder = commandBuffer.makeComputeCommandEncoder()
commandEncoder.setComputePipelineState(pipelineState!)
commandEncoder.setTexture(sourceTexture, at: 0)
commandEncoder.setTexture(destinationTexture, at: 1)
commandEncoder.dispatchThreadgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
commandEncoder.endEncoding()
autoreleasepool {
let inPlaceTexture = UnsafeMutablePointer<MTLTexture>.allocate(capacity: 1)
inPlaceTexture.initialize(to: destinationTexture)
blur.encode(commandBuffer: commandBuffer, inPlaceTexture: inPlaceTexture, fallbackCopyAllocator: nil)
}
流水線狀態的Shader是這樣創建的自定義。
let defaultLibrary = device.newDefaultLibrary()
let kernelFunction = defaultLibrary!.makeFunction(name: name)
do {
pipelineState = try device.makeComputePipelineState(function: kernelFunction!)
} catch {
fatalError("Unable to create pipeline state")
}
而在儀表它顯示有在一些Malloc 16 bytes
和[Mtkview draw]
方法泄漏。
屏幕截圖如下所示。
我想找到的位置和方式問題的發生幫助。
謝謝。
這工作正常。謝謝。但是,你可以建議我如何實現備用副本分配器。我試過了,但它正在崩潰@warrenm。 –