gpt4 book ai didi

performance - 当每个字符需要单独放置和格式化时,如何快速渲染文本?

转载 作者:行者123 更新时间:2023-12-03 19:04:42 25 4
gpt4 key购买 nike

我尝试在屏幕上显示格式化文本。首先解析非常简单的 HTML 文本(有 b、u、i 之类的标签),然后使用 Canvas.TextOut 呈现每个字符功能在适当的位置和字体。

我注意到的第一件事是, Canvas 上每个单独字符的渲染都相当慢。整个句子的渲染要快得多。很明显,当 Canvas 被迫重新绘制时,当表单在屏幕上移动时。

一种解决方案是用均匀的字体对字符进行聚类并立即渲染它们。但是,当格式丰富时,它不会有太大帮助。此外,我需要字符是离散的实体,可以以任何方式呈现。例如,没有 WinAPI 支持文本对齐 taJustify 或 block 写入...

另一种方法是在位图上渲染,或者明智地使用 ClipRect TCanvas 的属性(我还没有尝试过)。

无论如何,当在 TRichEdit 中显示相同格式的文本时,重绘操作不会造成时间损失。另一个简单的例子是所有主要的浏览器,它们显示大量格式化文本没有问题......他们是否像我一样渲染每个字符,但他们做得更有效???我不知道。

那么你知道一些加速应用程序的方法吗(格式化文本渲染?)。

感谢您的想法...

示例代码:(使TForm尽可能大,用鼠标捕获它并在屏幕下向下拖动它。当你将它向上移动时,你会看到“跳跃”的运动)

procedure TForm1.FormPaint(Sender: TObject);
var i, w, h, j:integer;
s:string;
switch:Boolean;
begin
w:=0;
h:=0;
s:='';
for j:=0 to 5 do
for i:=65 to 90 do s:=s + Char(i);

switch:=False; // set true to see the difference

if switch then
begin
for j:=0 to 70 do begin
for i := 1 to Length(s) do
begin
Form1.Canvas.TextOut(50+ w,h +70 , s[i]);
w:=w + Form1.Canvas.TextWidth(s[i]);
end;
w:=0;
h:=h+15;
end;
end
else
begin
for j:=0 to 70 do begin
Form1.Canvas.TextOut(50+ w,h +70 , s);
w:=w + Form1.Canvas.TextWidth(s); // not optimalized just for comparison
w:=0; // not optimalized just for comparison
h:=h+15;
end;
end;
end;

最佳答案

使用分析器(例如 AQTime)来查找代码实际花费时间的位置。很有可能它不会是 TextOut()本身就是花费最多的时间。您正在通过 String 进行索引一次一个字符,将每个字符传递给 TextOut()TextWidth() .这些方法都不接受Char参数作为输入,它们只取String而是输入,因此 RTL 花费精力分配和释放大量临时 String s 在内存中,取决于你的源 String是。我见过类似杀死循环性能的东西。

关于performance - 当每个字符需要单独放置和格式化时,如何快速渲染文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com