NSImage 与 NSBitmapImageRep:巨大的内存使用差异?
NSImage vs. NSBitmapImageRep: massive memory usage differences?
我正在尝试使用 Cocoa 处理大型 (8000×8000) 图像。使用 NSImage 时,以下代码立即用掉大约 1GB 的 RAM:
var outputImage = NSImage(size: NSMakeSize(8000, 8000))
outputImage.lockFocus()
// drawing operations here
但是使用NSBitmapImageRep时,只用了几百MB:
var outputRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: 8000, pixelsHigh: 8000, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)
var context = NSGraphicsContext(bitmapImageRep: outputRep!)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(context)
// drawing operations here
如果我算对的话,一张8000×8000的图片应该会用掉大约(8000×8000×4÷1024÷1024)=244MB,这和NSBitmapImageRep的内存占用是一致的。
为什么 NSImage 使用 4 倍的内存?
糟糕!我错过了 4 倍内存使用的意义。事实证明,NSImage 使用点而不是像素,这意味着在 Retina 设备上,所有 NSImage 实际上都将使用 2× 像素分辨率。这意味着我的8000×8000点(16000×16000像素)图像实际内存占用为977MB,与我的结果一致。
我正在尝试使用 Cocoa 处理大型 (8000×8000) 图像。使用 NSImage 时,以下代码立即用掉大约 1GB 的 RAM:
var outputImage = NSImage(size: NSMakeSize(8000, 8000))
outputImage.lockFocus()
// drawing operations here
但是使用NSBitmapImageRep时,只用了几百MB:
var outputRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: 8000, pixelsHigh: 8000, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)
var context = NSGraphicsContext(bitmapImageRep: outputRep!)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(context)
// drawing operations here
如果我算对的话,一张8000×8000的图片应该会用掉大约(8000×8000×4÷1024÷1024)=244MB,这和NSBitmapImageRep的内存占用是一致的。
为什么 NSImage 使用 4 倍的内存?
糟糕!我错过了 4 倍内存使用的意义。事实证明,NSImage 使用点而不是像素,这意味着在 Retina 设备上,所有 NSImage 实际上都将使用 2× 像素分辨率。这意味着我的8000×8000点(16000×16000像素)图像实际内存占用为977MB,与我的结果一致。