C++ Разыменование char-Pointer (массив изображений) очень медленно
У меня возникли проблемы с быстрым доступом к массиву неподписанных символов.
Я хочу на самом деле скопировать массив кодированных изображений BGRABGRA....BGRABGRA.... с аналогичной версией в OpenCV-версию, которая использует три слоя. Приведенный ниже код работает нормально, но очень медленно (около 0,5 секунды для изображения 640*480). Я указал, что оператор разыменования * делает это медленно. Есть ли у вас план, как это исправить? (Подсказка: BYTE - неподписанный символ)
// run thorugh all pixels and copy image data
for (int y = 0; y<imHeight; y++){
BYTE* pLine= vrIm->mp_buffer + y * vrIm->m_pitch;
for (int x = 0; x<imWidth; x++){
BYTE* b= pLine++; // fast pointer operation
BYTE* g= pLine++;
BYTE* r= pLine++;
BYTE* a= pLine++; // (alpha)
BYTE bc = *b; // this is really slow!
BYTE gc = *g; // this is really slow!
BYTE rc = *r; // this is really slow!
}
}
Спасибо!
2 ответа
Не должно быть - нет способа, который потребует 0,5 секунды для 640x480, если вы не делаете это на 8086. Есть какой-то другой код, который вы не показываете? Память назначения никуда не денется
ps взгляните на cvCvtColor(), он использует оптимизированные инструкции SSE2/SIMD для этого
На каком оборудовании находится память, которую вы читаете? Возможно, это устройство имеет ограниченную пропускную способность для используемой памяти или просто имеет медленную оперативную память. Если память разделяется многими устройствами, на ней также могут быть узкие места. Попробуйте прочитать весь экран (?) В локальной памяти, используя memcpy(), выполнив над ним операции в локальной памяти, а затем записав его обратно, используя memcpy(). Это уменьшит количество раз, когда вы должны договориться о доступе к нему с 640*480 до 1.