#arrays #performance #matrix #byte
#массивы #Производительность #матрица #байт
Вопрос:
Я накладываю пользовательский рисованный вид поверх видеокадра и отправляю эту информацию о пикселях наложения на мой микроконтроллер и кодирую ее в байтовый массив. Большинство значений RGB равно 0, потому что они находятся отдельно от видеокадра, а не от пользовательского представления, которое я рисую.
Я кодирую 32-разрядное значение rgb в 4 разных байта для каждого пикселя. Однако кадр выполняется очень медленно и отстает, потому что я перебираю весь кадр и преобразую каждое значение в байтовый массив. Я понимаю, что вызывает проблему, но интересно, есть ли способ ускорить ее.
Я бы удалил 0 и передавал только те значения, которые имеют допустимое значение RGB, но мне нужно сохранить позицию.
Размер матрицы составляет 518400 элементов.
for (int i = 0; i < A.size(); i ) {
byte *t = (byte *) amp;A.mem[i];
byte t1 = t[0];
byte t2 = t[1];
byte t3 = t[2];
byte t4 = t[3];
if (t1 != '' || t2 != '' || t3 != '' || t4 != '') {
writeSerialData(t, 4);
}
}
Ответ №1:
Вы могли бы сверить четыре байта с нулем за один раз:
int iMax = A.size();
for (int i = 0; i < iMax; ) {
int32_t *t = (int32_t *) amp;A.mem[i ];
if (*t) {
writeSerialData(t, 4);
}
}
Комментарии:
1. Если у меня есть оператор write вне оператора if и я записываю даже 1 байт, время завершения цикла увеличивается с 1-2 мс до 400-500 мс. Есть идеи? Внутри нет операторов печати
writeSerialData
Ответ №2:
Контролируете ли вы принимающую часть этого writeSerialData()
? Затем вы должны изобрести некоторую кодировку, которая задает новое смещение следующих данных.
Кроме того, используете ли вы 16 миллионов цветов в своем наложении? Если вы используете только несколько цветов, для этого они изобрели палитру. Если вы заранее знаете цвета, вы можете жестко запрограммировать их на обоих концах. Если нет — отправьте небольшой заголовок с информацией об этой палитре перед изображением. Это может сократить размер ваших данных в 4 раза. Если у вас есть только один цвет, вы можете дополнительно сократить объем данных до отдельных битов.
Обновить
Под «кодировкой» я подразумеваю какой-то особый формат ваших данных, отличный от простого значения RGB. Например, используете ли вы альфа-канал (я заметил, что вы не назвали свои цвета RGBA)? Если нет — вы можете использовать этот байт для кодирования длины, указав, что следующий цвет повторяется так много раз (до 255). Это сэкономит вам некоторую пропускную способность для ваших нулей (просто скажите, сколько их), а также для строки того же цвета (вам не нужно отправлять каждый пиксель).
Комментарии:
1. Я действительно контролирую принимающую часть
writeSerialData
. Когда вы ссылаетесь на это, вы имеете в виду чтение 4 байтов за раз? Не уверен, что я понимаю, когда вы упоминаете кодирование. Верно, я не стремлюсь к гибкости любого изменения цвета, но я посмотрю на CLUT.2. @joethemow — пожалуйста, ознакомьтесь с моим обновлением для кодирования
3. @joethemow — проблема решена? не могли бы вы, пожалуйста, поделиться — как?