В моем приложении есть подпрограмма, которая записывает MTL-текстуры в mov ie через AVAssetWriter. Когда я запускаю приложение на устройстве, управление памятью остается стабильным, а mov ie создается и записывается на диск. Однако, когда я опубликовал приложение в App Store (и скачал его), приложение вылетает вскоре после создания mov ie, независимо от размера mov ie. Запуск приложения через инструменты показывает огромное выделение памяти, происходящее в подпрограмме, которая извлекает PixelBuffer из MTLTextures. Вот где происходит крэ sh. Рассматриваемая процедура выполняется внутри al oop для каждой MTL-текстуры, которую я хочу записать:
func AVAssetWriterEncodeFrame(forTexture texture: MTLTexture) {
while !assetWriterVideoInput!.isReadyForMoreMediaData {
} // hang out here until isReadyForMoreMediaData == true
autoreleasepool(invoking: { () -> () in
let fps: Int32 = Int32(Constants.movieFPS)
guard let pixelBufferPool = assetWriterPixelBufferInput!.pixelBufferPool else {
print("[MovieMakerVC]: Pixel buffer asset writer input did not have a pixel buffer pool available; cannot retrieve frame")
return
}
var maybePixelBuffer: CVPixelBuffer? = nil
let status = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &maybePixelBuffer)
if status != kCVReturnSuccess {
print("[MovieMakerVC]: Could not get pixel buffer from asset writer input; dropping frame...")
return
}
guard let pixelBuffer = maybePixelBuffer else { return }
CVPixelBufferLockBaseAddress(pixelBuffer, [])
let pixelBufferBytes = CVPixelBufferGetBaseAddress(pixelBuffer)!
// Use the bytes per row value from the pixel buffer since its stride may be rounded up to be 16-byte aligned
let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
let region = MTLRegionMake2D(0, 0, texture.width, texture.height)
texture.getBytes(pixelBufferBytes, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)
let presentationTime = CMTimeMake(value: Int64(frameIndexForPresentationTime), timescale: fps)
assetWriterPixelBufferInput!.append(pixelBuffer, withPresentationTime: presentationTime)
CVPixelBufferUnlockBaseAddress(pixelBuffer, [])
frameIndexForPresentationTime += frameHoldLength // set up for next frame
}) // end of autoreleasepool
} // end of func AVAssetWriterEncodeFrame(forTexture texture: MTLTexture)
Пик, видимый на графике, бесконтрольно возрастает ПОСЛЕ того, как mov ie записывается на диск. Список распределений показывает тысячи записей, которые выглядят следующим образом:
@ autoreleasepool content. ... 4 КиБ А.В. Основание. - [AVAssetWriterinput helper]. (как видно на изображении выше)
Может кто-нибудь указать, что я делаю неправильно, и, надеюсь, как это исправить?