GDI+ で保持モード描画アプリケーションを開発しています。アプリケーションは、単純な形状をキャンバスに描画し、基本的な編集を実行できます。これを行う計算は最後のバイトに最適化されており、問題ではありません。組み込みの Controlstyles.DoubleBuffer を使用しているパネルに描画しています。
大きなモニター (私の場合は HD) でアプリを最大化して実行すると、問題が発生します。(大きな) キャンバスの 1 つの角から対角線上にあるもう一方の角まで線を引こうとすると、遅延が始まり、CPU が高くなります。
アプリの各グラフィカル オブジェクトにはバウンディング ボックスがあります。したがって、最大化されたアプリの 1 つのコーナーから対角線の反対側のコーナーに向かう線のバウンディング ボックスを無効にすると、そのバウンディング ボックスは実質的にキャンバスと同じ大きさになります。ユーザーが線を描いているとき、境界ボックスの無効化はこのように mousemove イベントで発生し、明確なラグが表示されます。このラグは、キャンバス上のオブジェクトが線のみの場合にも存在します。
これをさまざまな方法で最適化しようとしました。より短い線を引くと、CPU とラグが減少します。Invalidate() を削除して他のすべてのコードを保持すると、アプリは高速になります。バウンディングボックスの代わりに Region (図にまたがるだけ) を使用して無効化すると、同じように遅くなります。バウンディング ボックスを、背中合わせに配置された小さなボックスの範囲に分割して、無効化領域を減らした場合、目に見えるパフォーマンスの向上は見られません。
したがって、私はここで途方に暮れています。無効化をスピードアップするにはどうすればよいですか?
余談ですが、Paint.Net と Mspaint の両方に同じ欠点があります。ただし、Word と PowerPoint は、上記のように遅延も CPU 負荷もまったく発生せずに線を描くことができるようです。したがって、望ましい結果を達成することは可能ですが、問題はどのようにですか?