【问题标题】:Delphi FMX Android FillText is Slow and Resource intensiveDelphi FMX And​​roid FillText 速度慢且资源密集
【发布时间】:2019-02-15 10:26:18
【问题描述】:

我正在用 PaintBox 绘制一个(大)布尔表(大网格图案中的二进制 0,1 值)。如下面的代码所示。 注意:代码是简化的,只画了随机的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;

【问题讨论】:

  • Canvas.FillText 不适合循环绘制大量文本。我不确定是否有更合适的方法(因此,我不会回答),但 FillText 创建瞬态 TTextLayout 对象来进行实际绘图。您可以将该代码集成到您的代码中以仅创建一次该实例,然后使用它在循环中绘制文本而无需调用 Canvas.FillText

标签: android delphi text firemonkey paintbox


【解决方案1】:

你必须用BeginScene和EndScene封装你的绘图,否则绘图会很慢:

Canvas.BeginScene;
try
  //all your painting routines here
  Canvas.FillText(...);
  ... 
finally
  Canvas.EndScene;
end;

【讨论】:

  • 是的,我很清楚需要 BeginScene 和 EndScene,而且我的代码确实已经有了。 FillText 命令似乎仍然是高度资源密集型的。当我将 Circles (DrawEllipse) 用于“0”并将 Lines (DrawLine) 用于“1”时,代码运行良好、快速且不会崩溃(强制关闭)。因此,FillText 有一些资源密集型的东西。对于 0 和 1,我可以继续使用 Circles 和 Lines,但从长远来看,我想使用实际的 0 和 1 字符,
  • 在这种情况下,您的问题不好,因为您根本没有在问题中提及这一点。 FMX 性能不佳的最常见原因是缺少 Begin/EndScene,这就是我的回答。没有理由拒绝我的回答,因为您提出了一个不完整的问题!请更正您的问题。
  • @Hans OP 无法对您的答案投反对票,因为他没有足够的声誉来投反对票。他甚至没有足够的声誉来投票。
  • 您发布了与问题无关的疯狂猜测答案。即使是最初的问题(虽然它确实缺少更多代码)也有足够的信息来查明问题。问题在于 FillText 而不是 BeginScene/EndScene。
  • @DalijaPrasnikar 你是对的,这是一个猜测,但肯定不是一个疯狂的猜测,因为 FMX 上绘画性能低的最常见原因就是这个原因。由于 ChasH 是 SO 的新手,所以我还认为他是 FMX 的新手。当然,我本可以对这个问题发表评论,但我试图反对这样的趋势,即每个人都以评论的形式回答,害怕投反对票和怒火中烧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2019-06-22
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 2012-02-25
相关资源
最近更新 更多