You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Core ML异步预测触发BAD_ACCESS,性能优化遇阻求助

macOS Core ML + ScreenCaptureKit 异步预测崩溃与性能优化问题

问题背景

我开发了一款面向macOS的Core ML预测应用,应用能正常运行,但实际预测耗时是Xcode性能报告显示值的两倍。参考WWDC2023视频提到异步可提升预测速度,尝试用异步方法优化时,持续触发BAD_ACCESS错误,且无法定位崩溃位置。

核心代码流程

从ScreenCaptureKit的CMSampleBuffer.imageBuffer输入,流程为runModel()→Metal缩放CVPixelBuffer→预测→向Metal Renderer设置RenderData,代码如下:

func runModel(on pixelBuffer: CVPixelBuffer) {
    
    guard let surface = getIOSurface(from: pixelBuffer) else { return }
    
    Task {
        guard let result = try? await self.performInference(surface) else { return }

        await ScreenRecorder.shared
            .setRenderDataNormalized(surface: surface, depthData: result)
    }
}


func performInference(_ surface: IOSurface) async throws ->[Float]? {
        
    try Task.checkCancellation()
    
    guard let model = mlmodel else {return nil}

    // 从IOSurface获取CVPixelBuffer
    var px: Unmanaged<CVPixelBuffer>?
    let status = CVPixelBufferCreateWithIOSurface(kCFAllocatorDefault,
                                                    surface,
                                                    nil,
                                                    &px)
    guard status == kCVReturnSuccess, let px2 = px?.takeRetainedValue() else { return nil }
    
    // 缩放输入图像
    guard let data = metalResizeFrame(sourcePixelFrame: px2,
                                        targetSize: MTLSize.init(width: InputWidth, height: InputHeight, depth: 1),
                                        resizeMode: .scaleToFill) else {
        os_log("Preprocessing failed", type: .error)
        return nil
    }
    
    // 异步模型预测
    let input = model_smallInput(input: data)
    let prediction = try await model.model.prediction(from: input)
    
    // 转换结果格式
    var results: [Float] = []
    if let output = prediction.featureValue(for: "output")?.multiArrayValue {
        if let bufferPointer = try? UnsafeBufferPointer<Float>(output) {
            results = Array(bufferPointer)
        }
    }
    
    return results
}

我曾尝试将IOSurface存入数组以维持其生命周期,仍出现崩溃。

2024-10-15 更新:完整执行流程

createFrame(sampleBuffer: CMSampleBuffer) 
    runModel(pixelBuffer: CVPixelBuffer)
        await performInference(surface: IOSurface)
            - metalResizeFrame(sourcePixelFrame: CVPixelBuffer, targetSize: MTLSize, resizeMode: ResizeMode)
            - await model.prediction(input: ModelInput)
        await setRenderDataNormalized(surface: IOSurface, depthData: [Float])

Xcode显示崩溃发生在未调用的方法处;我使用的是ScreenCaptureKit异步屏幕捕获示例,推测单流程中使用await可能因后续屏幕捕获输入导致崩溃。

疑问

  • 是否应避免使用异步预测?
  • ScreenCaptureKit流搭配模型预测是否必须同步?
  • 若需同步,该如何提升预测速度?

内容的提问来源于stack exchange,提问作者timyau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:18:26