Arduino медленно рендерит картинку на tft дисплей 1.44 128x128.

valera0141
Offline
Зарегистрирован: 25.05.2017

Привет всем. Пишу игру танчики на ардуино. Интересует вот какой вопрос. Можно ли как то ускорить отрисовку картинки? Использую библиотеку Adafruit-ST7735-Library. Читал на этом же форумк у соседей, что это связано с низкой производительностью мк. Попробовал переписать код под stm32, он отрисовывать стал быстрее, но всё равно с задержкой. Снял видео по данной проблеме. Может кто то что подскажет? Изначально писал под дисплей nokia 5110, отрисовывало моментально, даже мерцания не было.

https://www.youtube.com/watch?v=YyASdFY8XJ8

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Может эта статья поможет или отсюда какие идеи навеяться.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

valera0141, для того, чтобы бороться с тормозами, сначала следовало бы понять причину этих тормозов. Например, почему на nokia моментально, а на 1.44 - с тормозами.

Ну и заодно прикинуть конкретные цифры - какова частота смены кадров сейчас и какой хотелось бы добиться.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И подключить дисплей через аппаратный SPI, а не через библиотеку UTFT.  Только быстрее всё равно будет ненамного. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ST7735 вроде как разновидность ST7775R, на который у меня есть даташит. У должен быть "прямой" интерфейс в стиле  i8080. Подключаете через него и пишете картинко "побайтно" за раз. Только это отожрет не менее 8+3 ноги от камня. Есть столько? Ищите даташит, смотрите в нем "как" это делать..

slider
Offline
Зарегистрирован: 17.06.2014

valera0141,  а  не надо стирать и заново перерисовывать весь экран ,только маленькие детали которые надо изменить (если это просто квадратик, то подтереть тыльную часть, подрисовать переднюю - вот и быстрое движение).  

изображения у вас в виде иконок в памяти для программы,  или где микроSD спрятана ?  иконки перенести в память команд, и интересно как оно будет  если попробовать перенести в массив ОЗУ . и еще попробовать как константами.

можно попробовать еще на esp8266

// yul-i-an  дельно предложил, однако на ютубе много проектов показано , искать там  game  arduino uno ,   game  arduino    .  к примеру https://youtu.be/sLvgW_zb6bQ

 

valera0141
Offline
Зарегистрирован: 25.05.2017

Полключено пока так

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h> // Hardware-specific library

//lcd
#define TFT_CS PB10
#define TFT_DC PB9
#define TFT_RST PB8
#define TFT_SCLK PB13   // set these to be whatever pins you like!
#define TFT_MOSI PB11   // set these to be whatever pins you like!
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

 

 

valera0141
Offline
Зарегистрирован: 25.05.2017

slider, обновлять только один тайл, с которым что то произошло, интересный способ. Надо попроьовать. Изображения у меня хранятся в памяти. Делал я их из .bmp через lcd assistant. Ниже пример пары картинок.

 

BMP bright[] = {0xFF, 0x91, 0x9F, 0x91, 0xF1, 0x91, 0x91, 0xFF};
BMP grass[] = {0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11};
BMP metal[] = {0xFF, 0xC3, 0xA5, 0x99, 0x99, 0xA5, 0xC3, 0xFF};
BMP squar[] = {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF};
BMP water[] = {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};

 

valera0141
Offline
Зарегистрирован: 25.05.2017

DetSimen, можно поподробнее? Или ткните носом, а то не могу толкового материала найти по этому поводу.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

valera0141, если мне не изменяет память, аппаратный SPI подключается, если не указывать конструктору MOSI, MISO и SCLK.

Но в любом случае 1 бит на точку и 16-18 бит на точку - разница большая.

valera0141
Offline
Зарегистрирован: 25.05.2017

Можете ещё подсказать вот что? У меня танк(npc) катается по карте сам, при столкновении со стеной едет в другую сторону. Ниже кусок подсчёта позиции при столкновении.

if (i >= (npcPos.x+8)/8) npcPos.x = i * 8 - 8;

Но вот только этот код срабатывет не одекватно. Предположим i = 40. Иногда нормально высчитывает число и приравнивает к игроку, а может высчитать так, что прировняет к персонажу позицию на пример 1540236. С чем это может быть связано? На игроке висит точно такая же часть кода и работает одекватно.

 

valera0141
Offline
Зарегистрирован: 25.05.2017

Сделал проверку столкновения по другому, теперь норм.