CAMetalLayer可绘制纹理在某些设备上很奇怪

来自金属层的图像

我正在使用下面的代码来从金属层获取和追加像素缓冲区。 在某些非特定设备上,输出如下所示,并且可绘制纹理pixelFormat为.invalid

 static func make(with currentDrawable: CAMetalDrawable, usingBuffer pool: CVPixelBufferPool) -> (CVPixelBuffer?, UIImage) { let destinationTexture = currentDrawable.texture var pixelBuffer: CVPixelBuffer? _ = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, pool, &pixelBuffer) if let pixelBuffer = pixelBuffer { CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0)) let region = MTLRegionMake2D(0, 0, Int(currentDrawable.layer.drawableSize.width), Int(currentDrawable.layer.drawableSize.height)) let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer) let tempBuffer = CVPixelBufferGetBaseAddress(pixelBuffer) destinationTexture.getBytes(tempBuffer!, bytesPerRow: Int(bytesPerRow), from: region, mipmapLevel: 0) let image = imageFromCVPixelBuffer(buffer: pixelBuffer) CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0)) return (pixelBuffer, image) } return (nil, UIImage()) } static func imageFromCVPixelBuffer(buffer: CVPixelBuffer) -> UIImage { let ciimage = CIImage(cvPixelBuffer: buffer) let cgimgage = context.createCGImage(ciimage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(buffer), height: CVPixelBufferGetHeight(buffer))) let uiimage = UIImage(cgImage: cgimgage!) return uiimage } 

有没有人知道为什么发生这种情况,以及如何防止它?

有几个经历这个人的反馈可以在这里find: https : //github.com/svtek/SceneKitVideoRecorder/issues/3