[FMX] 使用 TTextLayout 来加快批量文本绘制

实际上,我们在绘制大量文本时,如果调用 TCanvas.FillText,会重复的创建和翻译 TTextLayoutManager 对象,影响绘制效率。所以,如果你要在 FMX 应用中大量绘制文本时,应该尽量将 TTextLayoutManager 独立出来,用它来绘制,而不是用 FillText,我实际做了下测试,同一个字符串绘制 10000 次,用 TCanvas.FillText 用时约 1.8 秒,而用 TTextLayout 只用了 0.24 秒,效率提升了 7 倍多,还是相当可观的。

用 TTextLayoutManager 来绘制文本,需要以下几步:

1、当然是声明变量,并创建它的实例了(假设画布对象为 Canvas)

var
   Layout: TTextLayout;
begin
Layout := TTextLayoutManager.TextLayoutByCanvas(Canvas.ClassType).Create(Canvas);

2、设置 Layout 的各个绘制参数,以便准备绘制:

Layout.BeginUpdate;
Layout.TopLeft := PointF(0,0);
Layout.MaxSize := PointF(100,25);
Layout.WordWrap := False;
Layout.Opacity := 0.5;
Layout.HorizontalAlign := TTextAlign.Center;
Layout.VerticalAlign := TTextAlign.Center;
Layout.Font := Canvas.Font;
Layout.RightToLeft := False;
Layout.Text:='Hello,这是中文!';
Layout.EndUpdate;

3、调用 TTextLayout.RenderLayout 来完成渲染,如果要改变文字内容,只需要改变 TTextLayout.Text,改变位置当前就是 TopLeft 和 MaxSize 了;

Layout.RenderLayout(Canvas);

4、最后,当然是在使用完毕翻译 Layout 对象,就不缀述了。

注意一个问题,就是同时改变多个属性时,最好调用BeginUpdate/EndUpdate来避免重复触发一些不需要的动作,影响效率。

 

分享到: