Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS Multithreaded Zeichnen (https://www.delphipraxis.net/196934-multithreaded-zeichnen.html)

Rollo62 3. Jul 2018 10:36

AW: Multithreaded Zeichnen
 
Hallo Harry,

ja richtig, in Canvas.BeginScene wird ein Lock gemacht.
Win, OSX, Android funktionieren bei mir auch (nur das Android anscheinend etwas falsch skaliert,
aber das sit ein anderes Thema).
iOS geht bei mir damit leider auch nicht.

Mir ging es darum das mehrere Threads auf einem Bitmap schreiben können, das hatte ich probiert
mit 4 TPainter Klassen, die dann aber beim Schreiben gegenseitig aufeinander Warten müssen.
Funktioniert hat das schon, aber die 4 Painter haben sich ziemlich behindert gegenseitig.
Hatte aber noch externes Lock ausprobiert, mit dem BeginScene Lock hat sich das womöglich überschnitten.

Ich probiere noch ein bischen damit rum.

Rollo

Rollo62 3. Jul 2018 11:29

AW: Multithreaded Zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal ein Testprojekt drangehangen.
Basierend auf der Vorlage von TiGü habe ich das etwas erweitert und "buntisiert" (weil hübscher als schwarz/weiss) :stupid:

Läuft auf Win mit 4 TPainter-Threads, und dem Vorschlag von Harry immer direkt auf dem Image zu zeichnen.
Win Sample ist so wie gedacht: 4x Taste Drücken 4 separate Bereiche werden gemalt.

Schon OSX hat falsche Skalierungen (finde jetzt nicht so schnell den Fehler), und malt immer
im ganzen Bild statt in einem der 4 Teilbilder.

Android genauso falsch skaliert.

iOS malt im Moment gar nicht, habe ich bei mir bisher auch nicht hinbekommen.
Ich kann aber mit iOS zeichnen, das mache ich auch, ich muss mal checken wo jetzt genau das Problem sein könnte, habe aber gerade keine Zeit mehr dafür.


Rollo

Rollo62 3. Jul 2018 18:56

AW: Multithreaded Zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab noch ein bischen rumgespielt ...

Ich erzeuge 4 Teilbitmps in Threads, diese werden dan in einem Taeget Bitmap zusammengebaut.
Wenn Alle Threads fertig sind wird das komplette Target in das Image geschrieben, mit
Delphi-Quellcode:
procedure DoDrawBitmap(const ACanvasDst : TCanvas;
                       const ADstRc    : TRectF;
                       const ASrcBmp   : TBitmap);
var
  LDstRc: TRectF;
begin
    if ACanvasDst.BeginScene then
        try
            LDstRc := RectF(0, 0, ADstRc.Width, ADstRc.Width);
            LDstRc.Offset( ADstRc.TopLeft );


            ACanvasDst.DrawBitmap(ASrcBmp, // Src bmp full
                                  RectF(0,0, ASrcBmp.Width, ASrcBmp.Height), // Src rc full
                                  LDstRc, // dst part bmp to dst canvas
                                  1);

        finally
            ACanvasDst.EndScene;
        end;

end;
Wird das Teil-Bmp in das Tgt-Bmp geschrieben.

Funktioniert auf Win, OSX, And, aber noch nicht auf iOS :(

Sorry, der Code ist noch ein bischen wüst, durch die ganzen Tests, ich hoffe das erkennt man noch wieder :stupid:
Ob es jetzt Threadmäßig optimal ist wage ich auch zu bezweifeln, mit ging es erstmal drum das
Scaling und Printing überhaupt funktioniert.
Die Performance ist bei mit jedenfalls im Bereich 60-160FPS, je nach Plattform.

Aber wie man das auf eine optimale Performance bringt, vor Allem auch auf allen Platformen, ist noch nicht klar.

Womöglich mit TScene von Eugene, der Teilbereiche bei dem Bildupdate berücksichtigt, während FMX immer das ganze Bild updated.
Vielleicht hat ja noch jemand Ideen dazu.


Rollo

bytecook 3. Jul 2018 22:46

AW: Multithreaded Zeichnen
 
Hi Leute,

das hat zwar nichts mit IOS zu tun, jedoch mit multithreaded painting sowie mit teilweiser Aktualisierung...
Im Graphics32 Framework findet sich ein schöner Lösungsansatz zu Multithreaded 'Zeichnen', einfach mal so als Grundlage / Anregung.
Siehe TSyntheticImage in GR32_ExtImage.pas
https://graphics32.github.io/Docs/Un...mage/_Body.htm

Rollo62 4. Jul 2018 06:30

AW: Multithreaded Zeichnen
 
Hallo bytecook,

ja gute Idee, GR32 für FMX wollte ich schon immer mal Testen.
GR32 war schon immer eine super Lösung

Habe es mir nicht angesehen, aber ich vermute mal da wird noch ein Grafiklayer über den FMX-Layer gelegt.
Macht das wirklich Sinn, und wird das GR32 durch GPU unterstützt ?

Sollte man mal checken, ich kann aber erst nächste Woche weitertesten.

Rollo

Sherlock 4. Jul 2018 06:59

AW: Multithreaded Zeichnen
 
Liebe Mitstreiter, das ist alles ganz dufte, aber so wie es aussieht, nix für iOS. :pale:

Vermutlich muss wirklich im Mainthread gemalt werden, was für Applikationen, die viel Malen und dennoch nicht einfrieren sollen, nicht so ganz das gelbe vom Ei ist. Ich hänge an der Sache seit knapp einem Jahr. Es sieht langsam so aus, als müßte ich mich in Swift einlesen. :roll:

Danke jedenfalls für Eure Unterstützung!

Sherlock

TiGü 4. Jul 2018 08:31

AW: Multithreaded Zeichnen
 
Zitat:

Zitat von Sherlock (Beitrag 1406468)
Liebe Mitstreiter, das ist alles ganz dufte, aber so wie es aussieht, nix für iOS. :pale:

Vermutlich muss wirklich im Mainthread gemalt werden, was für Applikationen, die viel Malen und dennoch nicht einfrieren sollen, nicht so ganz das gelbe vom Ei ist. Ich hänge an der Sache seit knapp einem Jahr. Es sieht langsam so aus, als müßte ich mich in Swift einlesen. :roll:

Besteht die Möglichkeit auf den Gerät in die verwendete Canvas-Klasse zu debuggen?
Es gibt in FMX.Canvas.Mac ja einen TCanvasQuartz.
Wird der verwendetet?

Was mir noch eingefallen ist:
Kannst du prüfen, ob das Quell- und Ziel-Bitmap das exakt gleiche Farbformat haben?
Vielleicht schlägt das Ganze ja fehl, weil ein Bitmap im Thread bspw. irgendein anderes Farbformat hat (ARGB vs. BGRA vs. RGBA) als ein Bitmap eines TImage.

Sherlock 4. Jul 2018 09:03

AW: Multithreaded Zeichnen
 
Man kann derzeit (ist es wirklich schon ein Jahr?) mit Delphi nicht mehr on iDevice debuggen. Und im Simulator läuft alles total dufte und erwartungskonform.

Sherlock

Sherlock 4. Jul 2018 12:57

AW: Multithreaded Zeichnen
 
Äh, hier ein kleines Update (es hat mir keine Ruhe gelassen): Wenn man das Bitmap vor dem
Delphi-Quellcode:
Synchronize(UpdateGUI)
Aufruf in meiner ursprünglichen Painter.Execute Methode speichert, dann wird es auch auf der Oberfläche angezeigt. :shock:

Ich verstehe aktuell noch nicht den Zusammenhang, vermute allerdings, daß iOS einfach erst beim Speichern merkt, daß ich es ernst meine mit dem zeichnen, und dann alles, was bisher "virtuell" statt fand "realisiert".

Jedenfalls kann ich jetzt versuchen darauf aufzubauen, das speichern kostet quasi Null Zeit, bzw geht in meinen sonstigen Unternehmungen, um die Bitmap zu füllen, unter.

Sherlock

Sherlock 4. Jul 2018 13:50

AW: Multithreaded Zeichnen
 
So, noch eine Stunde später, noch eine Erkenntnis:
Die TBitmap.SaveToFile Methode macht etwas (für mich) unerwartetes. Die Bitmap wird auf einem TSurfaceBitmap assigned, und erst das wird dann gespeichert. Was genau eine TSurfaceBitmap ist, kann ich mangels Doku nicht sagen, aber wenn ich statt der Speichermethode diesen hohlen Dreizeiler ausführe:
Delphi-Quellcode:
      surf := TBitmapSurface.Create;
      surf.Assign(fBMP);
      surf.Free;
Dann wird die Bitmap immer korrekt angezeigt (TBitmapSurface benötigt FMX.Surfaces).

Mag das einer erklären :?:

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:37 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz