Самый быстрый способ копировать память с шагом в C?

Я пытаюсь скопировать 1 или 2 цветовых канала из данных изображения RGBA как можно быстрее (это самая медленная часть моего кода, и она замедляет работу всего приложения). Есть ли быстрый способ копирования с шагом?

Данные просто представлены как RGBARGBARGBA и т. Д., И мне нужно скопировать только значения R или, в другом случае, только значения RG.

Пока что у меня есть примерно следующее, чтобы скопировать значения R:

for(int i=0; i<dataSize; i++){
    dest[i] = source[i*4];
}

Для значений RG я делаю:

for(int i=0; i<dataSize; i+=2){
    dest[i] = source[i*2];
    dest[i+1] = source[(i*2)+1];
}

Все данные представляют собой однобайтовые значения без знака. Есть более быстрый способ? Я уже частично развернул цикл (делаю 64 значения за итерацию - незначительное ускорение сверх этого). Платформа - Armv7 (iOS), поэтому использование NEON (SIMD) может быть полезным, у меня, к сожалению, нет опыта!

К сожалению, об изменении данных не может быть и речи, это обеспечивается функцией readPixels () opengl и iOS не поддерживает чтение как L, LA, RG и т. д., насколько я могу судить.

12
задан 27 June 2011 в 08:56
поделиться