Einzelnen Beitrag anzeigen

Rollo62

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

AW: [Fmx, Vcl] Verhalten von TBitmap in Threads

  Alt 13. Apr 2016, 08:10
Dankesehr erstmal für die Antworten.

Zitat:
Insofern macht so eine Auflistung hier m.E., wenig Sinn, ...
Genau darum geht es mir, was man darf und was nicht, am Besten unter Allen Plattformen und Frameworks.
Zumindest für die Basics.

Ich habe grosse Unterschiede zw. iOS und Android, OSX und Win genauso.
Ich möchte aber einen Source für Alles benutzen können, und suche nach Möglichkeiten das zu kapseln.

@Harry
Der Hinweis mit Scanline ist sehr gut, ich bin bisher davon ausgegangen das es immer auch mit dem Canvas zu tun hat.
Aber es scheint wirklich nur den Speicher anzufassen.
Vielleicht ist das ein Ansatz zumindest Bitmaps 1:1 zu kopieren, um von einem Bitmap z.B. an ein TListView Image weiterzugeben.
Immerhin.

Aber ich vermute das TBitmap.Create() im Hauptprozess wird auch schon einiges an Performance brauchen, und das Kopieren am Ende ist dann
nur ein Teil.


Delphi-Quellcode:
function TBitmapData.GetPixelAddr(const I, J: Integer): Pointer;
begin
  Result := Pointer(NativeInt(GetScanline(J)) + I * BytesPerPixel);
end;

function TBitmapData.GetScanline(const I: Integer): Pointer;
begin
  Result := Pointer(NativeInt(Data) + I * Pitch);
end;

procedure TBitmapData.Copy(const Source: TBitmapData);
var
  I: Integer;
begin
  for I := 0 to Height - 1 do
    Move(Source.GetScanline(I)^, GetScanline(I)^, BytesPerLine);
end;
@Meduim
+1 für Graphics32: Nur gibt es das ja leider (noch) nicht für Fmx. Unter VCL benutze ich das auch ohne Probleme.

@Sir Rufo
Wenn man niemals einen Canvas anfassen darf heisst das doch das man noch nicht mal ein TBitmap.Create im Thread machen darf ?
Das Bitmap.Canvas muss dann doch irgendwie angelegt werden.
Ich habe unter FMX öfters festgestellt das TBitmap.CanvasClass nicht gesetzt oder sich anders verhält (skaliert, transformiert) als z.B. ein Image.Bitmap.Canvas.
Ich hätte gehofft das interne TBitmap.Canvas nur eine Simulation eines Canvas ist, und nicht weiter mit dem UI-Thread kommuniziert.

Unter Fmx gibt es auch ein TListViewItem.BitmapRef was wohl
nur einen Pointer auf das eigentlich Bitmap setzt, wenn ich das richtig verstehe.

Also könnte man versuchen so etwas in der Art zu machen:
- erst alle neuen, leeren Bitmaps im UI Thread anlegen, aber mit korrektem Size
- dann evtl. im Thread mit Scanline kopieren, bearbeiten (wird aber womöglich weniger effizient sein)
- danach könnten die Bitmaps im UI-Thread mit der TListView BitmapRef verbunden werden
- der Owner wäre danach nicht die ListView, dann muss das auch entsprechend verwaltet werden

Das gefällt mir aber gar nicht, gibts nichts besseres ?

Rollo
  Mit Zitat antworten Zitat