フォーマットされたテキストを画面に表示しようとしています。最初に非常に単純なHTMLテキストが解析され(b、u、iのようなタグがあります)、次に各文字がCanvas.TextOut
関数を使用して適切な位置とフォントでレンダリングされます。
私が最初に気付いたのは、キャンバス上のすべての個別の文字のレンダリングがかなり遅いということです。文全体のレンダリングははるかに高速です。キャンバスが強制的に再描画されたとき、フォームが画面上で移動したときは明らかです。
1つの解決策は、文字を均等なフォントでクラスター化し、一度にレンダリングすることです。しかし、フォーマットが豊富な場合は、あまり役に立ちません。さらに、文字は個別のエンティティである必要があります。これは、任意の方法でレンダリングできます。たとえば、テキストの配置をサポートするWinAPIはありません。taJustifyまたはブロック書き込み...
もう1つのアプローチは、ビットマップでレンダリングするかClipRect
、TCanvasのプロパティを賢く使用することです(まだ試していません)。
とにかく、同じフォーマットのテキストがTRichEditに表示される場合、再描画操作による時間のペナルティはありません。もう1つの簡単な例は、すべての主要なブラウザです。これは、大量のフォーマットされたテキストを表示するのに問題はありません...私と同じように各文字をレンダリングしますが、より効率的に表示しますか?私は知らない。
それで、アプリケーションを高速化するためのレシピを知っていますか(フォーマットされたテキストレンダリング?)。
あなたのアイデアに感謝します...
サンプルコード:(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;