Frage zur Optimierung Display Text mit Font

Gast #2513787
Lesenswert?
• ▲
▼
Hallo

Ich bin gerade dabei mir ein Code zu schreiben um text auf ein Display 
zu schreiben.
Es handelt sich um externe fonts die mittels Fontgeneratór erstellt 
wurden.

Soweit geht alles bis auf die Performance.

Kann man da noch was Optimieren??
Angehängte Dateien:
#2514412
Lesenswert?
• ▲
▼
Hier
1
        for( i = 0; i < 8; i++ )
2
        {
3
          if (c&(128>>i))
4
          {
5
            GLCD_SetPixel( x1+i, y+j, 1, layer );
6
          }
7
          else
8
          {
9
            GLCD_SetPixel( x1+i, y+j, 0, layer );
10
          }
11
        }

steckt noch einiges Potential. Schieben um eine variable Anzahl an 
Stellen ist immer eine schlechte Idee auf einem AVR.
Anstatt mit einer variablen Maske abzufragen, fragst du immer dasselbe 
Bit ab und schiebst dufür das Byte in c sukzessive um 1 Stelle weiter.

1
       if(font==1) c = pgm_read_byte( &data_table[ offset + o + byteOffset ] );
2
     if(font==2) c = pgm_read_byte( &data_table1[ offset + o + byteOffset ] );
3
     if(font==3) c = pgm_read_byte( &data_table2[ offset + o + byteOffset ] );

schreib dir halt erst mal eine Funktion, die 1 Zeichen ausgeben kann, 
wobei du die Startadresse im Flash (ergo den Font) dieser Funktion 
mitgibst. Dann brauchst du nicht bei jedem Zeichen eine 
Fallunterscheidung machen, welcher Font zu benutzen ist. Die 
Fontstartadresse stellst du dann 1 mal pro String fest und gibst alle 
Zeichen mit dieser Fontstartadresse aus.

Ausserdem ist so eine Funktion, die 1 Zeichen ausgeben kann, sowieso 
immer eine gute Idee.
Gast #2515829
Lesenswert?
• ▲
▼
Hallo

Es geht um ein 320x240 mit Epson S1D13700.


Hier ist die SET PIXEL Funktion
oid GLCD_SetPixel(unsigned int x,unsigned int y, int color,int layer)
{
unsigned char tmp = 0;
unsigned int address;
if(layer==1)address=SED1335_GRAPHICSTART1 + (40 * y) + (x/8);
if(layer==2)address=SED1335_GRAPHICSTART2 + (40 * y) + (x/8);
if(layer==3)address=SED1335_GRAPHICSTART3 + (40 * y) + (x/8);

GLCD_SetCursorAddress(address);

GLCD_WriteCommand(SED1335_MREAD);
tmp = GLCD_ReadData();

if(color)
  tmp |= (1 << (SED1335_FX - (x % 8)));
else
  tmp &= ~(1 << (SED1335_FX - (x % 8)));

GLCD_SetCursorAddress(address);
GLCD_WriteCommand(SED1335_MWRITE);
GLCD_WriteData(tmp);
}

Danke

Gruß

Paul
#2515846
Lesenswert?
• ▲
▼
Paul schrieb:

>
> Hier ist die SET PIXEL Funktion

Und für bestimmte Werte für x kann man das bei der Textasugabe so 
optimieren, so dass nicht jedes Pixel einzeln gemalt werden muss, 
sondern nach Möglichkeit bis zu 8 in einem Rutsch.
(wenn ich das richtig sehe, sind immer 8 in x-Richtung nebeneinander
liegende Pixel zu einem Byte zusammengefasst)

Und wenn es nicht diese bestimmten x-Werte sind, dann kann man die 
auszugebenden Bytes immer noch in Teile aufteilen, so dass dann trotzdem 
wieder möglichst viele Pixel in einem Byte in einem Aufwasch geschrieben 
werden können.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.