NSImage与NSBitmapImageRep:大量内存使用差异?

时间:2015-09-03 23:19:38

标签: macos cocoa core-graphics

我正在尝试使用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 x 8000的图像应该用完(8000×8000×4÷1024÷1024)= 244MB,这符合NSBitmapImageRep的内存使用情况。

为什么NSImage会根据需要使用4倍的内存?

1 个答案:

答案 0 :(得分:1)

糟糕!我错过了4倍内存使用的重要性。事实证明,NSImage使用点而不是像素,这意味着在Retina设备上,所有NSImages实际上都使用2×像素分辨率。这意味着我的8000×8000点(16000×16000像素)图像的实际内存占用量为977MB,这与我的结果一致。