AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Multithreaded Zeichnen

Ein Thema von Sherlock · begonnen am 2. Jul 2018 · letzter Beitrag vom 10. Jul 2018
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#1

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 06:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#2

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 06:59
Liebe Mitstreiter, das ist alles ganz dufte, aber so wie es aussieht, nix für iOS.

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.

Danke jedenfalls für Eure Unterstützung!

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 08:31
Liebe Mitstreiter, das ist alles ganz dufte, aber so wie es aussieht, nix für iOS.

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.
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#4

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 09:03
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#5

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 12:57
Äh, hier ein kleines Update (es hat mir keine Ruhe gelassen): Wenn man das Bitmap vor dem Synchronize(UpdateGUI) Aufruf in meiner ursprünglichen Painter.Execute Methode speichert, dann wird es auch auf der Oberfläche angezeigt.

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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#6

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 13:50
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#7

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 16:18
Zitat:
Man kann derzeit (ist es wirklich schon ein Jahr?) mit Delphi nicht mehr on iDevice debuggen.
Also ich debugge mit Rx10.2.2 XCode9.2, iOS10.2.6 und MacOS10.13.5 wieder, aber noch traue ich
mich nicht auf die letzten Stände upzudaten, weil im Moment Alles so gut läuft.

TBitmapSurface:
Ja das könnte eine Möglichkeit sein, ich hatte über ide Jahre mehrere Versuche mit LoadFromFile/Stream, und setze da auch BitmapSurface ein.
Insbesondere im Zusammenhang mit TBitmapCodecManager war das ein gutes Team.
Durch das viele Rumprobiere und Hin- und Her kann ich leider nicht mehr genau sagen warum.

Kann gut sein das BMS auch hier die Lösung ist, kann ich im Moment aber nicht checken.

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#8

AW: Multithreaded Zeichnen

  Alt 4. Jul 2018, 22:01
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
Das TBitmapSurface ist so eine Art einheitliches Datenformat, das als Transferschnittstelle mit dem Bitmap-Codec-Manager zusammenarbeitet, um das Speicherbitmap in eine Datei oder einen Stream zu speichern oder zu lesen.

Warum die Aktionen, die beim surf.assign (fmbp) stattfinden, zur anschließenden Aktualisierung führen, kann ich mangels Testmöglichkeit nur vermuten, ich würde eine gewisse Möglichkeit bei "TMonitor.Enter", bzw. letztlich bei "TMonitor.Exit" sehen, da hier bestimmte Benachrichtigungen ans System übermittelt werden.

Versuch doch einfach mal nur mit TMonitor.enter (fbmp) und TMonitor.exit (fbmp).

Geändert von Harry Stahl ( 5. Jul 2018 um 17:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.
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