Zitat von
Rabenauge
@cdk Danke. Hab das korrigiert.
Zur Performance Erkenntnisse: ich hab gestern noch ein bisschen herumprobiert und, wenn man screenfüllende Bitmaps lädt, dann dauert das geschätzt eine halbe Sekunde. In meinem Fall sind das schon recht grosse: 480x320. Man sieht dann deutlich, wie sich der Bildschirm von links nach rechts aufbaut, aber nur als "flackern".
Kann man aber mit leben (es ist nur optisch unschön), eine flüssige Bedienung ist damit allemal möglich-man muss ja die betreffende Seite auch erst "wahrnehmen".
Die "Schnelliggkeit" eines Displays und seiner Treiber bemisst sich ja gerade in der Geschwindigkeit, in der es in der Lage ist, Texte und Grafiken in schneller Folge anzuzeigen, und zwar direkt, ungepuffert.
En solcher Test ist ja in einem bereits verlinkten Video (von Marek Buriak) sehr gut zu erkennen, und man sieht, welche Performancesteigerung erreichbar ist, wenn man nur andere Treiberprogramme verwendet:
https://www.youtube.com/watch?v=vnEwzN14BsU
Ähnliche Benchmarktests gibt es auch von allen möglichen anderen Grafiktreiber-Libs, nur alle sind sie immer ein wenig anders, also nicht direkt vergleichbar.
Auch in "meinem" benchmark passiert nichts anderes, auch ich mache nur direkt aufeinanderfolgede Display-Ausgaben (verschiedene ungepufferte Textzeilen und verschiedene ungepufferte Grafiken, wie Linien, Kreise, Dreiecke, Rechtecke, Ellipsen, nur umrandet oder auch gefüllt), so wie man sie auch im täglichen Leben auf Grafikdisplays braucht. A-Bär: Mein test ist vereinfacht und standardisiert für etliche verschiedene Plattformen, jetzt kann man die Leistung direkt miteinander vergleichen.
Hier kann man extrem gut die Performance auf verschiedenen Pattformen (MCUs, SoCs, TFTs) beurteilen, und da die sehr simplen Display-Befehle in allen gängigen Grafik-Libs (H.Karlsen UTFT, Adafruit GFX, Marek.Buriak) vorhanden sind und auch sehr ähnlich aussehen, müsste es sehr einfach sein, diesen auch aufs Nextion anzuwenden, denn genau das ist es doch, was man auch für seine eigenen Grafik-Programme benötigt, und auch dann will man ja nichts anderes als mal eben ein paar Kreise (Tachometer), Rechtecke (Rahmen), Zeiger (Linien, Dreiecke) und Zahlen und Beschriftungen (Text) auf verschiedenen Farb-Hintergründen (gefüllte Flächen) anzuzeigen.
Daher nochmal der Testcode für Adafruit (identischer Code auf ILI9341 und auf OLED SSD1306), zum Vergleich auch für Marek Buriaks ILI9341 - man sieht, wie ähnlich die Codes einander sind:
Code:
// hw brickbench
// Adafruit ILI9340 / ILI9341
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"
// for Due/Mega/Leonardo use the hardware SPI pins (which are different)
#define _cs 10
#define _dc 9
#define _rst 8
// Using software SPI is really not suggested, its incredibly slow
// Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
// Use hardware SPI
Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
#define WHITE ILI9340_WHITE
#define TimerMS() millis()
unsigned long runtime[8];
void TFTprint(char sbuf[], int16_t x, int16_t y) {
tft.setCursor(x, y);
tft.print(sbuf);
}
inline void displayValues() {
char buf[120];
tft.fillScreen(ILI9340_BLACK); // clrscr()
sprintf (buf, "%3d %9ld int_Add", 0, runtime[0]); TFTprint(buf, 0,10);
sprintf (buf, "%3d %9ld int_Mult", 1, runtime[1]); TFTprint(buf, 0,20);
sprintf (buf, "%3d %9ld float_op", 2, runtime[2]); TFTprint(buf, 0,30);
sprintf (buf, "%3d %9ld randomize", 3, runtime[3]); TFTprint(buf, 0,40);
sprintf (buf, "%3d %9ld matrx_algb", 4, runtime[4]); TFTprint(buf, 0,50);
sprintf (buf, "%3d %9ld arr_sort", 5, runtime[5]); TFTprint(buf, 0,60);
sprintf (buf, "%3d %9ld TextOut", 6, runtime[6]); TFTprint(buf, 0,70);
sprintf (buf, "%3d %9ld Graphics", 7, runtime[7]); TFTprint(buf, 0,80);
}
int32_t test_TextOut(){
int y;
char buf[120];
for(y=0;y<20;++y) {
tft.fillScreen(ILI9340_BLACK); // clrscr()
sprintf (buf, "%3d %9d int_Add", y, 1000); TFTprint(buf, 0,10);
sprintf (buf, "%3d %9d int_Mult", 0, 1010); TFTprint(buf, 0,20);
sprintf (buf, "%3d %9d float_op", 0, 1020); TFTprint(buf, 0,30);
sprintf (buf, "%3d %9d randomize", 0, 1030); TFTprint(buf, 0,40);
sprintf (buf, "%3d %9d matrx_algb", 0, 1040); TFTprint(buf, 0,50);
sprintf (buf, "%3d %9d arr_sort", 0, 1050); TFTprint(buf, 0,60);
sprintf (buf, "%3d %9d displ_txt", 0, 1060); TFTprint(buf, 0,70);
sprintf (buf, "%3d %9d testing...", 0, 1070); TFTprint(buf, 0,80);
}
return y;
}
int32_t test_graphics(){
int y;
char buf[120];
for(y=0;y<100;++y) {
tft.fillScreen(ILI9340_BLACK);
sprintf (buf, "%3d", y); TFTprint(buf, 0,80); // outcomment for downwards compatibility
tft.drawCircle(50, 40, 10, WHITE);
tft.fillCircle(30, 24, 10, WHITE);
tft.drawLine(10, 10, 60, 60, WHITE);
tft.drawLine(50, 20, 90, 70, WHITE);
tft.drawRect(20, 20, 40, 40, WHITE);
tft.fillRect(65, 25, 20, 30, WHITE);
tft.drawEclipse(70, 30, 15, 20); // original test
// tft.drawCircle(70, 30, 20, WHITE); // alternatively, just if no drawEclipse is avaiable in the Arduino graph libs!
}
return y;
}
int test(){
unsigned long time0, x, y;
double s;
char buf[120];
int i;
float f;
// lcd display text / graphs
time0=TimerMS();
s=test_TextOut();
runtime[6]=TimerMS()-time0;
sprintf (buf, "%3d %9ld TextOut", 6, runtime[6]); Serial.println( buf);
TFTprint(buf, 0,70);
time0=TimerMS();
s=test_graphics();
runtime[7]=TimerMS()-time0;
sprintf (buf, "%3d %9ld Graphics", 7, runtime[7]); Serial.println( buf);
TFTprint(buf, 0,80);
Serial.println();
y = 0;
for (x = 0; x < 8; ++x) {
y += runtime[x];
}
displayValues();
sprintf (buf, "gesamt ms: %9ld ", y);
Serial.println( buf);
TFTprint(buf, 0,110);
x=50000000.0/y;
sprintf (buf, "benchmark: %9ld ", x);
Serial.println( buf);
TFTprint(buf, 0,120);
return 1;
}
void setup() {
Serial.begin(9600);
// Setup the LCD
tft.begin();
tft.setTextColor(ILI9340_WHITE); tft.setTextSize(1);
}
void loop() {
char buf[120];
test();
sprintf (buf, "Ende HaWe brickbench");
Serial.println( buf);
TFTprint(buf, 0, 140);
while(1);
}
Code:
// hw brickbench
// ILI9341_due NEW lib by Marek Buriak http://marekburiak.github.io/ILI9341_due/
#include <SPI.h>
#include "ILI9341_due_config.h"
#include "ILI9341_due.h"
#include "SystemFont5x7.h"
//#include "Streaming.h"
// For the Adafruit shield, these are the default.
/*
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
*/
#define tft_cs 49
#define tft_dc 48
#define tft_rst 0
ILI9341_due tft = ILI9341_due(tft_cs, tft_dc); // <<<<<<<<<<<<<<<<<<<< drop RESET pin !
char textBuff[20];
// Color set
#define BLACK 0x0000
#define RED 0xF800
#define GREEN 0x07E0
//#define BLUE 0x001F
#define BLUE 0x102E
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define ORANGE 0xFD20
#define GREENYELLOW 0xAFE5
#define DARKGREEN 0x03E0
#define WHITE 0xFFFF
uint16_t color;
uint16_t colorFONDO = BLACK;
#define TimerMS() millis()
unsigned long runtime[8];
void TFTprint(char sbuf[], int16_t x, int16_t y) {
tft.cursorToXY(x, y);
tft.printAt(sbuf,x,y);
}
inline void displayValues() {
char buf[120];
tft.fillScreen(BLACK); // clrscr()
sprintf (buf, "%3d %9ld int_Add", 0, runtime[0]); TFTprint(buf, 0,10);
sprintf (buf, "%3d %9ld int_Mult", 1, runtime[1]); TFTprint(buf, 0,20);
sprintf (buf, "%3d %9ld float_op", 2, runtime[2]); TFTprint(buf, 0,30);
sprintf (buf, "%3d %9ld randomize", 3, runtime[3]); TFTprint(buf, 0,40);
sprintf (buf, "%3d %9ld matrx_algb", 4, runtime[4]); TFTprint(buf, 0,50);
sprintf (buf, "%3d %9ld arr_sort", 5, runtime[5]); TFTprint(buf, 0,60);
sprintf (buf, "%3d %9ld TextOut", 6, runtime[6]); TFTprint(buf, 0,70);
sprintf (buf, "%3d %9ld Graphics", 7, runtime[7]); TFTprint(buf, 0,80);
}
int32_t test_TextOut(){
int y;
char buf[120];
for(y=0;y<20;++y) {
tft.fillScreen(BLACK); // clrscr()
sprintf (buf, "%3d %9d int_Add", y, 1000); TFTprint(buf, 0,10);
sprintf (buf, "%3d %9d int_Mult", 0, 1010); TFTprint(buf, 0,20);
sprintf (buf, "%3d %9d float_op", 0, 1020); TFTprint(buf, 0,30);
sprintf (buf, "%3d %9d randomize", 0, 1030); TFTprint(buf, 0,40);
sprintf (buf, "%3d %9d matrx_algb", 0, 1040); TFTprint(buf, 0,50);
sprintf (buf, "%3d %9d arr_sort", 0, 1050); TFTprint(buf, 0,60);
sprintf (buf, "%3d %9d displ_txt", 0, 1060); TFTprint(buf, 0,70);
sprintf (buf, "%3d %9d testing...", 0, 1070); TFTprint(buf, 0,80);
}
return y;
}
int32_t test_graphics(){
int y;
char buf[120];
for(y=0;y<100;++y) {
tft.fillScreen(BLACK);
sprintf (buf, "%3d", y); TFTprint(buf, 0,80); // outcomment for downwards compatibility
tft.drawCircle(50, 40, 10, WHITE);
tft.fillCircle(30, 24, 10, WHITE);
tft.drawLine(10, 10, 60, 60, WHITE);
tft.drawLine(50, 20, 90, 70, WHITE);
tft.drawRect(20, 20, 40, 40, WHITE);
tft.fillRect(65, 25, 20, 30, WHITE);
//tft.drawEllipse(70, 30, 15, 20, WHITE); // original test
tft.drawCircle(70, 30, 20, WHITE); // alternatively, just if no drawEclipse is avaiable in the Arduino graph libs!
}
return y;
}
int test(){
unsigned long time0, x, y;
double s;
char buf[120];
int i;
float f;
// lcd display text / graphs
time0=TimerMS();
s=test_TextOut();
runtime[6]=TimerMS()-time0;
sprintf (buf, "%3d %9ld TextOut", 6, runtime[6]); Serial.println( buf);
TFTprint(buf, 0,70);
time0=TimerMS();
s=test_graphics();
runtime[7]=TimerMS()-time0;
sprintf (buf, "%3d %9ld Graphics", 7, runtime[7]); Serial.println( buf);
TFTprint(buf, 0,80);
Serial.println();
y = 0;
for (x = 0; x < 8; ++x) {
y += runtime[x];
}
displayValues();
sprintf (buf, "gesamt ms: %9ld ", y);
Serial.println( buf);
TFTprint(buf, 0,110);
x=50000000.0/y;
sprintf (buf, "benchmark: %9ld ", x);
Serial.println( buf);
TFTprint(buf, 0,120);
return 1;
}
void setup() {
Serial.begin(115200);
// Setup the LCD
tft.begin();
tft.setRotation(iliRotation270);
tft.fillScreen(colorFONDO);
tft.setFont(SystemFont5x7);
tft.setTextColor(WHITE);
Serial.println("tft started");
}
void loop() {
char buf[120];
test();
sprintf (buf, "Ende HaWe brickbench");
Serial.println( buf);
TFTprint(buf, 0, 140);
while(1);
}
weitere flink portierte Testcodes ab hier (runterblättern): http://www.mindstormsforum.de/viewto...&t=8491#p68170,
komplette Benchmark-Tests (außer Grafik auch Rechenperformance) finden sich ab hier: http://www.mindstormsforum.de/viewto...&t=8095#p63773
Dieser Brickbench Test läuft sogar ohne nennenswerte Änderungen auf einem Raspi mit 1080p HDMI screen und openVG Grafik, oder alternativ auf einem Raspi mit SSD1306 oder SH1106 OLED per I2C
http://www.mindstormsforum.de/viewto...p=67838#p67839
http://www.mindstormsforum.de/viewto...p=69371#p69370
und sogar auf Lego NXTs und EV3s mit NXC, nxtOSEK C, RobotC, GCC C++, Java, C# und ev3Basic!
Und Code-Änderungen (z.B. andere Grafiken als Zusatz oder Ersatz, an anderer Stelle) müsste man in der Praxis für eigene Programme/Projekte ebenso schnell und simpel umschreiben können.
Daher würde ich auch fürs Nextion erwarten, dass man in ähnlicher Weise ruck-zuck diesen einfachen Testcode portieren können müsste.
Lesezeichen