GDI+ のパフォーマンスについて説明している信頼できる (そして願わくば広範な) 本や Web サイトを知っている人はいますか?
たとえば、私は最近、この優れた実験に出くわしました。Graphics.FillPath()
私は最近、それが よりもはるかに速いことに気付きましたGraphics.DrawPath()
。私が見逃している他の重要な情報を知りたいです。
のれん、デビッド
GDI+ のパフォーマンスについて説明している信頼できる (そして願わくば広範な) 本や Web サイトを知っている人はいますか?
たとえば、私は最近、この優れた実験に出くわしました。Graphics.FillPath()
私は最近、それが よりもはるかに速いことに気付きましたGraphics.DrawPath()
。私が見逃している他の重要な情報を知りたいです。
のれん、デビッド
うーん。パスのアウトラインを描画する必要がある場合、FillPath が DrawPath よりも高速であることを知っていても意味がありません。
GDI+ を最適化する最善の方法は、他のコードの場合とまったく同じです。まず、最適化しないでください。その代わり:
これらのことをすべて終えたら、レンダリングの最適化に関する本を探し始めることができます。もちろん、それでも遅すぎる場合は。プロファイラーを実行して、レンダリングのどの部分が最も遅いかを調べます。
改善できると思われる場合は、さまざまなレンダリング方法を試すか (たとえば、Graphics.Clear() は、FillRectangle() で背景を塗りつぶすよりもはるかに高速である可能性が高い)、またはさまざまなレンダリング順序 (すべてのものを描画する) を試してください。状態の変更に時間がかかる場合に備えて、最初に 1 つの色を選択します - 最新のグラフィックス カードでは、バッチ操作が非常に重要になることがよくあります. 通常、複数のポリゴンを描画する単一の呼び出しは、複数の単一ポリゴンの呼び出しを行うよりも高速です。遅延レンダリング バッファを作成し、レンダリング パスの最後にそれらすべてをコミットしますか?)
その後、ハードウェアに近づくために GDI または DirectX の使用を検討する必要があるかもしれません。
これはあなたが探している答えではないかもしれませんが、GDI+をまったく使用しないことを検討してください。最近、2D-CAMアプリケーションのレンダリングスタックを書き直す必要がありました。最も重要な要件は、適切なアンチエイリアス行を高速に取得することでした(アンチエイリアスは、既存のGDIレンダラーを書き直すきっかけとなりました)。
これが200アイテムのレンダリングで得られたいくつかの結果です(各アイテム自体はいくつかの線と小さな塗りつぶされた形状のマーカーです)。これらは(Windows 7の)フレームレートであるため、高いほど良いです。
200アイテム:GDI = 51、GDI + = 20、D2D = 59、WPF = 33、GL=59。
(D2DはDirect2D、GLはOpenGLです)。すでに、GDI+が後れを取っていることがわかります。WPFは保持モードAPIであるという点でおそらく障害がありますが、OpenGLもダブルバッファリングされており、同じようにスムーズに見えます。
1000アイテムでは、違いがより顕著になります。
GDI = 23、GDI + = 5、D2D = 17、WPF = 2、GL=40。
そうです、WPFは現在2 FPSに低下しており、GDI+は5FPSでクロールしています。したがって、D2Dを検討するか、単にOpenGLに戻ってください。それが私たちが現在使用しているものであり、書き直しから3か月後、私たちは正しい選択をしたと思います。プログラミングモデル自体は、D2Dのように見えるよりもはるかにクリーンです。
使用しているWPFレンダリングは高度に最適化されていることに注意してください。コールバック、イベント、バインディングはありません。DrawingContextを取得し、最下位レベルのプリミティブを使用して各フレームにすべてを描画するだけなので、イベントのオーバーヘッドは発生しません。
興味のある方はお知らせください。使用したテストスイートをお送りしますので、いじってみてください。
(GDI +を回避する理由の1つは、ハードウェアアクセラレーションが行われる可能性が低いことです)。