Быстрое копирование массивов с условием
- Войдите на сайт для отправки комментариев
Пт, 26/04/2013 - 19:46
Доброго времени суток.
У меня вопрос по поводу копирования массивов.
Есть два массива:
Код C++ | ||
|
Мне нужно скопировать массив cb в mainbuf на определенные координаты, с условием, что значение ячейки cb != 0xE3. Пока реализую так:
Код C++ | ||
|
Эта операция происходит очень медленно, а таких операций проводится довольно много.
Как можно это оптимизировать? memcpy - ? - но там нельзя использовать условия.
Прошу вашей помощи.
Заранее спасибо
Как можно это оптимизировать?
Ну, для начала следует вынести операции умножения из внутреннего цикла:
Это уже даст приращение в скорости.
На втором шаге можно вообще от умножений избавиться - еще ощутимое ускорение.
Спасибо, скорость действительно поднилась (немного). А что если распараллелить цикл, скорость возрастет?
может легче при выводе массива 320х240 знать адрес вывода второго массива? Толку копировать, если массив это просто последовательно заполненый кусок памяти.
Все не совсем так просто. У меня есть много массивов 16*16(с флагом PROGMEM) и один огромный массив 320*240. Мне нужно вывести на определенные координаты большого массива малый массив 16*16.
А вообще, все это графическая система. Большой массив - видео-память. Малые массивы - спрайты(маленькие изображения).
Проблему почти решил. Сделал как писали step962 и Osseum. Также применил распараллелизацию цикла. Скорость заметно поднилась, но все же...
предлагаю сделать внешеий цикл while(cb[i]!=0xE3){...}
хотя полагаю у вас таких ячеек не особо много
А вообще, все это графическая система. Большой массив - видео-память. Малые массивы - спрайты(маленькие изображения).
я понял что это такое. у вас массив из 76800 точек, т.е. байт. вы выводите его с нуля до 76800... выводим до 10500, потом второй массив, третий пятый... потом продолжаем завполнять с основного. другими словами зачем копировать весь спрайт, если можно указать адрес второго массива.
Очень хорошая идея. Жаль, что в моем случае это невозможно. Я не могу управлять выводом большого массива, так как выводит его не ЦПУ контроллера, а DMA контроллер напрямую из ОЗУ и отправляет на порты.
пойдет система. еще скажите что у вас две области памяти, одна выводиться, другая заполняется.
Ну не знаю... Я работаю с Arduino Due и VGA выводом. Я использовал спец. библиотеку Vga, там все сделано на DMA(контроллер прямого доступа к памяти). Я пытался переключить адрес в регистре у DMA - ничего не заработало. Да и не особо я умею обращаться с DMA, однако весч это очень полезная.
PS: Если разберусь, попробую сделать переключение адреса.