Хранение растровых данных в целочисленном массиве для скорости? - PullRequest
0 голосов
/ 22 ноября 2011

Я использую Cocoa / Objective-C и использую NSBitmapImageRep getPixel: atX: y: для проверки, является ли R 0 или 255. Это единственный фрагмент данных, который мне нужен (растровое изображение только черно-белое)

Я замечаю, что эта единственная функция потребляет больше ресурсов процессора в моем приложении и составляет около 95% накладных расходов. Быстрее ли мне предварительно загрузить растровое изображение в двумерный целочисленный массив

NSUInteger pixels[1280][1024];

и прочитайте значения следующим образом:

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

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Одной вещью, которая может оказаться полезной, может быть преобразование данных в нечто более «плотное». Так как вас интересует только один бит на пиксель, хранить больше не имеет смысла. Хранение большего количества данных, чем необходимо, означает, что вы получаете меньше использования из своего кэша, что может реально замедлить процесс, если изображение велико и / или доступ очень случайный.

Например, вы можете использовать самое большое «родное» целое число платформы и упаковать в пиксели, чтобы использовать один бит для каждого пикселя. Это сделает доступ немного более сложным, так как вам нужно провести однобитное тестирование, но это может быть победой.

Вы бы сделали что-то вроде этого:

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

Затем инициализируйте этот массив, используя метод медленного получения, один раз на пиксель. Затем вы можете прочитать значение пикселя, используя что-то вроде image[y * ((WIDTH + 31) / 32) + (x / 32)] & (1 << (x & 31)).

Я неясен ("может", "могу" и т. Д.), Поскольку это действительно зависит от вашего шаблона доступа, размера изображения и других вещей. Вы, вероятно, должны проверить это.

1 голос
/ 22 ноября 2011

Я не знаком с Objective-C или объектом NSBitmapImageRep, но разумное предположение состоит в том, что подпрограмма getPixel использует отсечение, чтобы избежать чтения вне памяти, что может привести к замедлению (среди прочего).

Загляните внутрь и посмотрите, что он делает.

( обновление ) Узнав, что это код Apple, вы, вероятно, не можете заглянуть внутрь него. Однако документация для NSBitmapImageRep_Class, по-видимому, указывает на то, что getPixel:atX:y: выполняет по крайней мере некоторую магию типов. Вы можете проверить, обрезан ли результат, открыв пиксель за границей изображения и наблюдая за результатом.

bitmapData может показаться вам интересным: получить указатель на данные, а затем прочитать массив самостоятельно, избегая преобразования или отсечения типов.

...