Более быстрый способ загрузить матрицу в байтовый массив?

#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 — проблема решена? не могли бы вы, пожалуйста, поделиться — как?