我正在使用Cocoa / Objective-C,我正在使用NSBitmapImageRep getPixel:atX:y:来测试R是0还是255.这是我需要的唯一数据(位图只有黑白)。
我注意到这个功能是我应用程序中CPU功耗的最大吸引力,占95%的开销。我将位图预加载到二维整数数组
会更快吗?NSUInteger pixels[1280][1024];
并读取如下值:
if(pixels[x][y]!=0){
//....do stuff
}
答案 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似乎是你感兴趣的东西:获取指向数据的指针,然后自己读取数组,避免类型转换或剪切。