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;
Другие вопросы по тегам