Registriert seit: 11. Aug 2007
357 Beiträge
|
Performanceproblem mit Firemonkey
15. Okt 2019, 18:23
Hi,
ich habe hier ein ziemliches Performanceproblem mit Canvas in Firemonkey. Für eine Anzeige erstelle ich ungefähr 20 eigene Tiles die aus 2 Bildern bestehen. Einmal, wenn die Komponente den Fokus hat und einmal, wenn sie keinen Fokus hat.
Die Erstellung der 40 Bilder dauert auf einem Androiden 10 Sekunden. Auch unter Windows ist das ganze schnarchend langsam. Der Code für die Darstellung befindet sich hier unten. Der komplette Beispielcode ist im Anhang. Ich glaube der Flaschenhals ist FillRect und die Textausgabe. Wie dem auch seih kann ich mir nicht vorstellen, dass man den DefaultRenderItem Code nicht irgendwie beschleunigen kann.In einem separaten Thread/Task kann ich das ganze nicht rendern.
Delphi-Quellcode:
procedure TForm3.DefaultRenderItem(const ACanvas: TCanvas; const ARect: TRectF;
const AImage: TBitmap; const ASelected: Boolean);
var
i: Integer;
TH: single;
ABoundsRect: TRectF;
R: TRectF;
begin
ABoundsRect := ARect;
with ACanvas do
begin
BeginScene(nil);
try
// Shadow - there are much nicer ways to draw a shadow
ClearRect(ARect);
Stroke.Kind := TBrushkind.Solid;
Stroke.Color := TAlphaColorRec.Black;
for i := 0 to 5 do
begin
DrawRect(ABoundsRect, 5, 5, AllCorners, i / 100);;
ABoundsRect := RectF(ABoundsRect.Left + 1, ABoundsRect.Top + 1,
ABoundsRect.Right - 1, ABoundsRect.Bottom - 1);
end;
Stroke.Kind := TBrushkind.None;
Fill.Kind := TBrushkind.Solid;
Fill.Color := cCardBackgroundColor;
FillRect(ABoundsRect, 0*5, 0*5, AllCorners, 1);
TH := ABoundsRect.Height / 3;
if assigned(AImage) then
begin
R := RectF(ABoundsRect.Left, 0, ABoundsRect.Right,
ABoundsRect.Bottom - TH);
Fill.Bitmap.Bitmap.Assign(AImage);
Fill.Bitmap.WrapMode := TWrapMode.TileStretch;
Fill.Kind := TBrushkind.Bitmap;
FillRect(R, 5, 5, [TCorner.TopLeft, TCorner.TopRight], 1);
end;
R := RectF(ABoundsRect.Left, ABoundsRect.Bottom - TH, ABoundsRect.Right,
ABoundsRect.Bottom);
Fill.Kind := TBrushkind.Solid;
if ASelected then
Fill.Color := cCardDescription
else
Fill.Color := cCardDescriptionFocus;
FillRect(R, 5, 5, [TCorner.BottomLeft, TCorner.BottomRight], 1);
R := RectF(R.Left + 10, R.Top, R.Right - 10,
R.Top + (R.Bottom - R.Top) / 2);
Font.Family := cGridFont;
Font.Size := FScreenScale * 15;
Font.Style := [TFontStyle.fsBold];
Fill.Color := TAlphaColorRec.White;
if FTitle <> '' then
FillText(R, FTitle, false, 1, [], TTextAlign.Leading,
TTextAlign.Center);
if FDescription <> '' then
begin
R.Offset(0, R.Height);
Font.Style := [];
FillText(R, FDescription, false, 0.8, [], TTextAlign.Leading,
TTextAlign.Leading);
end;
finally
EndScene;
end;
end;
end;
|