ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
7 августа
1309268
Eddy_Em (13.05.2023 11:20, просмотров: 4400)
А как бы так быстренько спрайтовый буфер экрана текстом заполнять? 

Работаю с экранчиком на непонятном чипе. Источники в сети утверждают, что там либо ILI9341, либо ILI9340 - считать регистр идентификатора не могу, похоже, китайцы не подключили MISO чипа (а вместо него воткнули одну из координат тачскрина). Но не важно, т.к. протоколы у них одинаковые в плане необходимых мне регистров.

Так вот, начал делать наброски GUI и заметил адское торможение. Вывод изображения из спрайтового буфера в буфер экрана у меня идет в конечном автомате по SPI через DMA, по две строчки кряду (1280 байт) и работе остальных автоматов вообще не мешает. А вот заполняю я спрайтовый буфер "за один присест": читаю и обрабатываю данные с BME280 (но это - буквально миллисекунда-другая), читаю данные с АЦП (оно у меня по DMA молотится, так что просто нужно для каждого из 10 каналов медиану из 9 значений вычислить), а потом рисую текст.

И вот текст я рисую мегаидиотским способом - попиксельно: https://github.com/eddyem/stm32samples/blob/master/F3%3AF303/NitrogenFlooding/screen.c#L175

Получается в среднем, что если текста много (т.е. он покрывает весь экран), то заполнение спрайтового буфера занимает чуть ли не 10 миллионов тактов МК! Но это - грубые прикидки. А фактически у меня две мелкие строчки и одна высокая выводятся около четверти секунды! Невооруженным глазом это сразу заметно по сбоям в мигании индикаторных светодиодов (я их тупо программно ногодрыгом дергаю, т.к. времена большие).


Собственно, вопрос: может, кто-то из великих оптимизаторов поделится опытом, как значительно (хотя бы в 20 раз) ускорить процесс заполнения текстом спрайтового буфера?

Я-то, понятно, для начала исключу вызов функции DrawPix, вставив ее тело внутрь - уже с десяток тактов на каждом пикселе сэкономлю. Еще думаю промежуточный буфер завести: заполнять его, а потом применять к спрайтовому (это ускорит работу при мастшабировании шрифтов, когда я N раз одно и то же рисую). Но и мелкие шрифты с масштабом 1 достаточно долго отображаются и совершенно непонятно, как это ускорить (ведь буква имеет переменную ширину, да и может выводиться не ровно в начале спрайта, поэтому нельзя надеяться, что будет возможным просто приравнять спрайтовый пиксельный буфер пиксельному буферу шрифта).

eddy-em.livejournal.com github.com/eddyem