2012-02-14 4 views
0

私はwinformsアプリケーションをC#で開発しました。これには多くのスクリーンペインティングが必要です。このペイントには、カスタムコントロールやその他の2Dオブジェクトのレンダリングが含まれます。問題は画面全体をペイントするのに約4〜5秒かかります。コードを最適化して、必要なすべてのデータをディスクやネットワークから読み込むのではなく、メモリ自体で利用できるようにしました。.NET GDIクラスでのWin32 API呼び出しの使用

はさらに私が代わりに.NETが提供するGDIクラスを使用するには、次のオプション

  1. 直接コールのWin32APIによって公開されたGDI機能のために行くことを計画していたレンダリング時間を削減するために、

  2. DirectXを使って、レンダリングが非常に効率的だと聞きました。私のアプリケーションは、3Dレンダリングの種類は関係ありません。

どのオプションを使用するか決定するのに手伝ってください。任意の高性能な第三者のコンポーネントやライブラリのように、これ以外のオプションがありますか?個人的な経験から

+0

あなたはいくつのコントロールを持っていますか?百人? –

+0

@HansPassant:その約5Kから7Kのコントロール – AbrahamJP

+1

うわー、それは驚くほどわずか7秒かかります。あなたはそれをカットする必要があります、ああ、100程度です。 –

答えて

1

  • GDI +は、それは純粋なGDIに(GDI +を使用しています).NETから切り替えるために多くを助けにはなりません< 2倍GDIよりだけ遅くなります。

  • Direct2Dは、少なくとも基本的な図形を描くために、GDIと同じくらい遅いです。あなたが何かもっと複雑なことをしない限り、おそらく助けにならないでしょう。

おそらく、図面を縮小し、データをダブルバッファすることです。

もしもうまくいかない場合は、メモリ内にビットマップを生成し(グラフィックスAPIを完全に避けて、byte[]などを使用して)、単に画面に直接blit(コピー)することをお勧めします。それは難しいですが、ほとんどの場合、最も速いことが分かります。

+0

あなたの意見をお寄せいただきありがとうございます。Win32のAPI呼び出しを直接行うことをお勧めします。何ミリ秒かでパフォーマンスを向上させる可能性のあるいくつかの.NETレイヤをスキップできるように思えます。 – AbrahamJP

+0

@AbrahamJP:すでに言及したように、それはたかだか2番目か2つを削るかもしれませんが、まだ満足できるものではありません。 – Mehrdad

関連する問題