Обзор
У меня есть буфер изображения, который мне нужно преобразовать в другой формат. Буфер исходного изображения - четыре канала, 8 бит на канал, альфа, красный, зеленый и синий. Буфер назначения - три канала, 8 бит на канал, синий, зеленый и красный.
Таким образом, метод грубой силы:
// Assume a 32 x 32 pixel image
#define IMAGESIZE (32*32)
typedef struct{ UInt8 Alpha; UInt8 Red; UInt8 Green; UInt8 Blue; } ARGB;
typedef struct{ UInt8 Blue; UInt8 Green; UInt8 Red; } BGR;
ARGB orig[IMAGESIZE];
BGR dest[IMAGESIZE];
for(x = 0; x < IMAGESIZE; x++)
{
dest[x].Red = orig[x].Red;
dest[x].Green = orig[x].Green;
dest[x].Blue = orig[x].Blue;
}
Однако мне требуется больше скорости, чем при использовании циклов и трехбайтовых копий. Я надеюсь, что может быть несколько трюков, которые я могу использовать для уменьшения количества чтения и записи в памяти, учитывая, что я запускаю 32-разрядную машину.
Дополнительная информация
Каждое изображение кратно не менее 4 пикселей. Таким образом, мы могли бы адресовать 16 ARGB-байтов и переместить их в 12 RGB-байтов на цикл. Возможно, этот факт может быть использован для ускорения работы, тем более, что он красиво падает на 32-битные границы.
У меня есть доступ к OpenCL - и в то время как для этого требуется переместить весь буфер в память графического процессора, а затем переместить результат обратно, тот факт, что OpenCL может работать на многих участках изображения одновременно, и тот факт, что большой блок памяти ходы на самом деле довольно эффективны, может сделать это полезным исследованием.
Пока я привел пример небольших буферов выше, я действительно перемещаю HD-видео (1920x1080) и иногда большие, в основном меньшие буферы, поэтому, в то время как ситуация 32x32 может быть тривиальной, копирование 8,3 Мбайта байт данных изображения by byte действительно, очень плохо.
Работа на процессорах Intel (Core 2 и выше), и, следовательно, есть команды потоковой передачи и обработки данных, о которых я знаю, но не знаю - возможно, указатели на то, где искать специализированные инструкции по обработке данных, были бы хорошими.
Это происходит в приложении OS X, и я использую XCode 4. Если сборка безболезненна и очевидный способ пойти, я отлично разбираюсь по этому пути, но не сделал этого на этой установке, прежде чем сделать я опасаюсь погрузиться в это слишком много времени.
Псевдокод в порядке - я не ищу полного решения, просто алгоритм и объяснение любых обманщиков, которые могут быть не сразу понятны.