Pixelabfrage extrem langsam [erledigt]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pixelabfrage extrem langsam

Beitrag von Mathias »

Es geht lediglich darum Fonts zu erstellen für dieses Mini Display
Solch ein Display hatte ich auch vor ein paar Jahren ausprobiert. An dem Ding habe ich die Zähne ausgebissen und musste scheitern, weil ich es mit AVR und FPC probieren wollte. :oops:
Mit Arduino ging es problemlos.

Wen du idelale Font für dein Display suchst, hier eine gute Quelle: https://www.zap.org.au/projects/console ... index.html

Die *.psftx sind alles Fonts im Ascii-Text, welche man sehr einfach in eine passende Matrix konvenieren kann.

Als Basis kannst du diese Source verwenden.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const
  ofs = 10;
  size = 22;
var
  sl: TStringList;
  i, y, x: integer;
  s: string;
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.SetSize(8 * 256, 16);
  sl := TStringList.Create;
  sl.LoadFromFile('t.fnt.psftx');
  for i := 0 to 255 do begin
    for y := 0 to 15 do begin
      s := sl[ofs + i * size + y];
      for x := 0 to 7 do begin
        if s[x + 2] = '.' then begin
          Canvas.Pixels[i * 8 + x, y] := clWhite;
          Write(' ');
        end else begin
          Write('X');
          Canvas.Pixels[i * 8 + x, y] := clBlack;
          Bit.Canvas.Pixels[i * 8 + x, y] := $FFFFFF;
        end;
      end;
      WriteLn();
    end;
    WriteLn(#10);
  end;
  sl.Free;
  bit.SaveToFile('t.fnt.bmp');
  bit.Free;
end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5129
Registriert: Fr 8. Apr 2011, 09:01

Re: Pixelabfrage extrem langsam

Beitrag von wp_xyz »

siro hat geschrieben: Sa 19. Apr 2025, 09:51 Es geht lediglich darum Fonts zu erstellen für dieses Mini Display
Eine Komponente für so ein ähnliches Display (TLCDDisplay) gibt es im industrial-Package (OPM) inkl. Zeicheneditor: https://wiki.freepascal.org/Industrial#TLCDDisplay

siro
Beiträge: 758
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Pixelabfrage extrem langsam

Beitrag von siro »

Coole Seite Mathias, Danke Dir auch für den Code.

Auch das Package von wp_xyz SEHR interessant. Hab ich gleich mal installiert und läuft auf Anhieb.

Mein momentaner Controller ist ein PIC16F17126 im SO-14
Hier schreibe ich grad die entsprechenden Hardware Funktionen für
I2C ADU DAC RS232. Das ist auch schon recht fortgeschritten und ausgetestet...
Der I2C sollte eigentlich was ganz anderes steuern, aber um den überhaupt auszuprobieren
hatte ich dieses kleine Display von Segor.
Das machte dann grad so viel Spass, dass mein ursprüngliches Projekt in den Hintergrund getreten ist :lol:
und ich mich mit der Grafik beschäftige...
PutPixel Rectangle Line Circle läuft schon super, nun sind halt die Buchstaben und Grafiken dran.
Leider wieder alles in (dritter Buchstabe des Alphabets... :P ) mangels Pascal Compiler...
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 758
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Pixelabfrage extrem langsam

Beitrag von siro »

Jetzt muss ich nochmal rückfragen :

Ich wollte eben eine Zeitmessung machen.
Das geht in Windows ja besonders gut mittels QueryPerformanceCounter.....
dazu wird jedoch die Unit Windows benötigt.
Wenn ich aber die Unit mit aufnehme, gibt es ein Problem mit TBitmap.Create :roll:
siehe Screenshoot:
TBitmapCreate.png
TBitmapCreate.png (21.22 KiB) 1397 mal betrachtet

sorry, Problem gelöst, das wurde hier schon mal besprochen:
viewtopic.php?t=9125
Ich muss die Unit Windows nach vorne bringen...
Danke an Mathias :wink:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pixelabfrage extrem langsam

Beitrag von Mathias »

Wenn ich aber die Unit mit aufnehme, gibt es ein Problem mit TBitmap.Create
Wieder der typische Klasiker.
Die unit Windows muss immer zuerst sein, ansonsten mit er TBITMAP von Windows.

Code: Alles auswählen

uses
  Windows, blu, bla;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 758
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Pixelabfrage extrem langsam

Beitrag von siro »

Jetz mal eben zur Zeitersparnis:
Eine Funktion von mir mit Canvas.Pixels[] dauert ca 35 Sekunden bei einer PaintBox mit 310*170 Pixel.
Für alle 4 Funktionen (links, rechts, oben , unten)benötige ich also 140 Sekunden....

So habe ich mal geteset wie lange es dauert für eine Pixelabfrage mittels Canvas.Pixels[]
das dauert tatsächlich ca. 700 Mikrosekunden für einen Pixel.
Bei 310*170 Pixel also 52700*700 µs = 36,89 Sekunden für jede meiner Funktion.
Das ganze also mal 4 = 147,56 Sekunden 2,46 Minuten. ist tatsächlich so.... :mrgreen:

Nun zu Jörg seiner Variante mit der Bitmap:
Komplett dauert es ca. 2,8 Millisekunden. :shock:

Ich bin begeisert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Pixelabfrage extrem langsam

Beitrag von af0815 »

Ist so, wundert mich nicht.

Die Canvasfunktion muss für jeden Pixel komplexe Vorgänge intern auslösen um an die Informationen zu kommen. Kann man sich ansehen wenn man in die LCL und auch später in die FCL eintaucht.
Geht man über die Bitmap ist der Weg viel kürzer, weil bei einer Bitmap kann man bis auf die Pixelebene durchgreifen, wenn man gewisse Regeln einhält. Allerdings ist man dort unter Umständen schon genötigt das Plattform spezifisch zu machen.
Dafür erntet man den Geschwindigkeitsbonus.

Alte Sache, je abstrakter und Plattform Unabhängig umso langsamer.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten