2008-09-16 9 views
12

不規則なグリッドに多数の小さな文字列を表示するC#Windows Formsアプリケーションのテキストレンダリングを最適化する必要があります。いつでも1秒間に4回更新できる5000以上のセルが表示されます。フォントファミリとサイズはセル全体で一貫していますが、色はセルによって異なります(太字/斜体/プレーンなど)。Windowsフォームでテキストを描画するための最速APIですか?

私がいるTextRenderer.DrawTextGraphics.DrawStringに関するウェブ上の情報を矛盾見てきた最速/最高、Win32レベルでGDIGDI+比較に減少しています。

私はまた、Windows XPとWindows Vistaとでは根本的に異なる結果を見ましたが、主なターゲットはWindows XPです。素晴らしい進歩を約束する記事 の下にWinFXDirectX 10は役に立ちません:-)

ここで最善のアプローチは何ですか?私は小さなC++/CLIレイヤーを導入し、デバイスコンテキストの処理を最適化してパフォーマンスを向上させることを心配していませんが、どちらの方向性があるかについての決定的なアドバイスが必要です。

EDIT: 最初の応答ありがとうございます。私は背景のビットマップレンダリングとGDIの同等の呼び出しの固執を組み合わせて試行します。

答えて

5

マイクロソフトの開発者は、自分のブログにGDI vs. GDI+ Text Rendering Performanceの記事を投稿しました。彼のシステムでは、GDI DrawTextはGDI + DrawStringより約6倍高速でした。

本当のスピードの悪魔である必要がある場合、TextOutはDrawTextよりも高速ですが、自分でクリッピングやワードラップを処理する必要があります。 ExtTextOutはクリッピングをサポートしています。

GDIレンダリング(TextRenderer)は、GDIを使用してWindowsの他の部分と一貫しています。 GDI +はデバイスに依存しないように試みるため、some spacing and emboldening are inconsistent。一貫性のないレンダリングの例については、SQL Server 2005の表面領域構成ツールを参照してください。

+0

私がVistaとXPの大きな違いを見たときに私が使ったのは、ブログリンクのサンプルアプリでした。私のVista PC、GDI、GDI +は同等でしたが、XPでは6xの違いがあります。これはおそらくVistaドライバーの問題ですが、ここではいくつかの難点を強調しています - ありがとう! –

+1

ヒストリカルノート:ExtTextOutは、いくつかのカード/ドライバで実線の四角形を描く最も速い方法でした:) –

2

GDIは一般にGDI +の描画が高速です。私は何千もの行とテキスト文字列を引き出し、GDI +からGDIに切り替えるというプロジェクトに取り組み、パフォーマンスが大幅に向上しました。それはWindows XPを使っていたので、私はVistaについてはコメントできません。また、パフォーマンスを向上させるために、図面にダブルバッファリングを使用することをお勧めします。画面のビットマップと互換性のあるビットマップを作成し、描画するたびに再利用します。

3

GDIを使用しても、特にスクロールが必要な場合は、テキストレンダリングが遅くなります。独立したレンダリングスレッドを作成し、200ミリ秒ごとにUIスレッドに通知し、現在の結果をbitbltします。スムーズなユーザーエクスペリエンスを提供します。

2

ネイティブコードで図面を実行するためのC++/CLI interopクラスを作成すると、派手な描画が行われます。私たちはこれを目撃して測定しました。

あなたがそれをやっていないなら、graphics.DrawStringはTextRenderer.DrawTextよりわずかに速いです。

2

私のWindows 7 64ビットシステムでは、TextOutはDrawStringよりも少し遅いです! TextRenderer.DrawTextはDrawStringよりもはるかに低速です。

+1

私もこれを発見しました...しかし、何らかの理由が見つかりません! – series0ne

関連する問題