Delphi FMX Android FillText медленный и ресурсоемкий
Я рисую (большую) булеву таблицу (двоичные значения 0,1 в большой сетке) с помощью PaintBox. Как в коде ниже. Примечание: код упрощен, только рисует случайные 0 и 1, чтобы представить проблему. Также я обновил вопрос с полным кодом, поскольку комментатор заявил, что первоначальный вопрос был неопределенным.
Использование FillText для рисования (сотни) отдельных двоичных (0 или 1) значений оказалось МЕДЛЕННЫМ!. Также при выполнении большого панорамирования через PaintBox приложение зависает и принудительно закрывается на устройстве Android.
Итак, ясно, что FillText недостаточно для этого случая, и задаетесь вопросом, знает ли кто-нибудь о лучшей технике?
procedure TMainWin.PaintBoxPaint(Sender: TObject; Canvas: TCanvas);
VAR Fcstroke:TStrokeBrush;
xp,yp,Tsze:INTEGER;
tw,th:SINGLE;
p1,p2:TPointF;
MyRect:TRectF;
begin
Canvas.BeginScene;
// Clear
Canvas.Clear(TAlphaColorRec.Beige);
Canvas.Fill.Color:= TAlphaColorRec.Black;
Canvas.Fill.Kind:= TBrushKind.Solid;
// Text Prop
Canvas.Font.Family:= 'Roboto';
Canvas.Font.Style:= [];
Canvas.Font.Size:= 40;
Canvas.Stroke.Thickness:= 2;
Canvas.Stroke.Kind:= TBrushKind.Solid;
Canvas.Stroke.DefaultColor:= TAlphaColorRec.Black;
tw:= Canvas.TextWidth('0')*1.2;
th:= Canvas.TextHeight('0');
Fcstroke:= TStrokeBrush.Create(TBrushKind.Solid,TAlphaColorRec.Green);
Fcstroke.DefaultColor:= TAlphaColorRec.Green;
Fcstroke.Thickness:= 2;
// Table
Tsze:= 50;
FOR yp:= 1 TO Tsze DO
BEGIN
// Horz table Line
p1:= TPointF.Create( tw,yp*th);
p2:= TPointF.Create((Tsze+1)*tw,yp*th);
Canvas.DrawLine(p1,p2,1,Fcstroke);
// Vert table Line
p1:= TPointF.Create(yp*tw, th);
p2:= TPointF.Create(yp*tw,(Tsze+1)*th);
Canvas.DrawLine(p1,p2,1,Fcstroke);
// Text
FOR xp:= 1 TO Tsze DO
BEGIN
MyRect:= TRectF.Create(xp*tw,yp*th,xp*tw+tw,yp*th+th);
IF (Random(10)>5) THEN
Canvas.FillText(MyRect,'0',False,100,[],TTextAlign.Center,TTextAlign.Center)
ELSE
Canvas.FillText(MyRect,'1',False,100,[],TTextAlign.Center,TTextAlign.Center);
END;
END;
// End
Canvas.EndScene;
end;
1 ответ
Вы должны инкапсулировать свой рисунок с помощью BeginScene и EndScene, иначе рисунок будет очень медленным:
Canvas.BeginScene;
try
//all your painting routines here
Canvas.FillText(...);
...
finally
Canvas.EndScene;
end;