работа с буфером экрана (ксроллинг)
- Войдите на сайт для отправки комментариев
Втр, 08/11/2016 - 16:41
Приветствую!
Хочу сделать скролл экрана. организовал буффер:
char screen[LCD_H][LCD_W];
теперь нужно сдвинуть экран вверх, освободив нижнюю строку. Как это лучше сделать?
Правимльно ли будет такое решение?:
for (int y=0; y<screen_H-1;y++) { for (int x=0;x<screen_W;x++) { screen[y][x]=screen[y+1][x]; } }
Ну, если x и y не перепутаны, то правильно. Вот только боюсь, скорость Вас не устроит.
ну, какбы, да.
скорость можно за счет ассемблера или каких-то магических пассов с копированием участков памяти решить, но тут я полный профан, а учиться - долго ;-)
скорость можно за счет ассемблера или каких-то магических пассов с копированием участков памяти решить
Нельзя.
НУ мне не нужно скроллить HD экран. У меня всего 14*6 знаков.
Визуально можно ускорить если иметь попиксельную копию экрана в локальной памяти , да еще изменять только те пиксели, что несоответствуют друг другу, таким образом мы избавляемся от излишнего чтения из буфера экрана и "ненужных" записей в буфер, а эти операции как раз долгие.
НУ мне не нужно скроллить HD экран. У меня всего 14*6 знаков.
Ну, не знаю, Вы попробуйте. Может Вас и устроит, чего нам тут сейчас воду в ступе-то толочь?
Если не устроит, надо думать о более хитрых алгоритмах. Например, визуально быстрее смотрится "через строчку", т.е. типа всё чётные, потом нечетные. И вообще, это общая идея - если скроллить "через N" строк, то визуально кажется быстрее.
Надо делать, пробовать и смотреть.
завтра попробую - на дивайсине проводок оторвался.
у большинства дисплеев есть команда автоскрола.
У PCD8544 - не нашел такой
ааа, я думал что какой-то тфт. сорри.
ой, погодите, так Вы собрались скроллить познаково или попиксельно? Если познаково, то проблем быть не должно.
Только знаете что, всё-таки Ваша программа формально правильна, но сильно неоптимально.
Сделайте так, расположите свой массив в памяти по строкам, т.е. чтобы в памяти шла сначала вся нулевая строка, потом вся первая строка, потом вся вторая и т.д.
Тогда цикл у Вас буде один (по строкам), а строки копируйте с помощью функции memcpy - так значительно быстрее.
я так понимаю вы шрифт (текст) выводите.
затирайте на текущем месте, выводите на новом изменив координату вывода. и по кругу.
расположите свой массив в памяти по строкам
Да, я уже дкмал об этом. Поэтому и массив с измерениями [y] [x], а не наоборот. Попробую.
я так понимаю вы шрифт (текст) выводите.
затирайте на текущем месте, выводите на новом изменив координату вывода. и по кругу.
А вот это интересно. не копировать строки, а хранить экранный номер строки и менять его в цикле. Нужно подумать.
А вот это интересно. не копировать строки, а хранить экранный номер строки и менять его в цикле. Нужно подумать.
Если Вы имеете в виду что-то типа "кольцевого буфера строк", то да, так еще быстрее. Но это чуть более геморойно в программировании.
ОК, вроде скролл получается. Я все-же копирую посимвольно, так как вывожу на экран в этом же цикле.
Осталось реализовать LF и CR, но что-то я запутался. Выпутываюсь пока. Получится - опубликую код для освистания.
Фигня какая-то! не могу понять, что происходит. Скроллинг есть, но вывод служебных символов с кодами 10 и 13 корежит экран - появляется дубляж строк и зацикливание. Может поможете увидеть, где чего порыть?
ВОт, я ее победил! Глупейшая ошибка в логике - делал очистку остатка строки при передаче CR, а не LF!
вроде пока работает!
С Победой!
Вот для чего это было ;-)
https://github.com/doleynikov/MySketchbook/tree/master/ttbasic_ESP8266