Zitat Zitat von Rabenauge Beitrag anzeigen
@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.