将位图数据存储在整数数组中以提高速度?

时间:2011-11-22 09:55:14

标签: objective-c c macos cocoa

我正在使用Cocoa / Objective-C,我正在使用NSBitmapImageRep getPixel:atX:y:来测试R是0还是255.这是我需要的唯一数据(位图只有黑白)。

我注意到这个功能是我应用程序中CPU功耗的最大吸引力,占95%的开销。我将位图预加载到二维整数数组

会更快吗?
NSUInteger pixels[1280][1024];

并读取如下值:

if(pixels[x][y]!=0){
//....do stuff
}

2 个答案:

答案 0 :(得分:2)

可能有用的一件事可能是将数据转换为更“密集”的数据。由于您只对每个像素位的单个位感兴趣,因此存储更多内容是没有意义的。存储的数据超出必要的数量意味着您可以减少缓存的使用量,如果图像很大和/或访问非常随机,这可能会减慢速度。

例如,您可以使用平台中最大的“本机”整数并打包像素,以便为每个像素使用一个位。这将使访问更加复杂,因为您需要进行单比特测试,但这可能是一个胜利。

你会做这样的事情:

uint32_t image[HEIGHT * ((WIDTH + 31) / 32)];

然后使用慢速getter方法初始化此数组,每个像素一次。然后,您可以使用类似image[y * ((WIDTH + 31) / 32) + (x / 32)] & (1 << (x & 31))的内容读出像素的值。

我很模糊(“可能”,“可以”等等),因为它实际上取决于您的访问模式,图像大小和其他内容。你应该测试它。

答案 1 :(得分:1)

我不熟悉Objective-C或NSBitmapImageRep对象,但合理的猜测是getPixel例程使用剪切来避免在内存之外读取,这可能会减慢(除其他外)。

看看里面,看看它做了什么。

(的更新) 得知这是Apple代码后,你可能无法看一下它。 但是,NSBitmapImageRep_Class的{​​{3}}似乎表明getPixel:atX:y:至少执行某种类型的魔术。您可以通过访问图像边界外的像素并观察结果来测试是否剪切结果。

documentation似乎是你感兴趣的东西:获取指向数据的指针,然后自己读取数组,避免类型转换或剪切。