Windows CE 6.0 より前 (すべての Windows Mobile/Windows Embedded Handheld バージョンを含む) では、グラフィックス コードは別のプロセス (GWES.EXE) に実装されていたため、GDI 呼び出しを行うたびにクロスプロセス呼び出しが必要でした。CE 5.x のクロスプロセス呼び出しは、デスクトップよりもはるかに安価ですが、単純な関数呼び出しやカーネル モードへの呼び出しよりも高価です。
デスクトップでは、NT 4.0 以降、GDI はカーネル モードで実装されています。元の NT 3.1 では、CE モデルのクロスプロセス呼び出しに似ていました。プロセス間の呼び出しやユーザー/カーネル モードの切り替えのオーバーヘッドを軽減するために、デスクトップ GDI は、別のペンやブラシを選択するか、別のペンやブラシを使用するなど、キューをフラッシュする必要がある操作を実行するまで、ユーザー モード側で操作をバッチ処理します。 -以外を返す従来の関数のBOOL
- またはバッファがいっぱいであるか、または を呼び出して明示的にフラッシュしますGdiFlush
。
Windows CE にはこのバッチ処理機能がありません。すべての呼び出しが GWES プロセスを直接呼び出すことになり、処理が大幅に遅くなります。各呼び出しでできるだけ多くの作業を行うことで、これを軽減できます。複雑な線が必要な場合は、個々の MoveToEx/LineTo 呼び出しではなく Polyline を検討してください。オーバーラップするオブジェクトをレンダリングするのではなく、各ピクセルに 1 回だけタッチするようにし、無効な領域を利用して再描画が必要な画面の部分のみを描画します ( GetUpdateRgn
orを使用して、領域を有効としてマークするGetUpdateRect
を呼び出す前に実行します)。BeginPaint
CE グラフィックス アクセラレーション モデルはかなり基本的なもので、ビットブリットに基づいています。Windows 2000 モデルのデスクトップ デバイス ドライバーがサポートするより大きな一連の機能はサポートしていません。アクセラレーションが利用できるかどうかは、ハードウェアにアクセラレータ チップがあるかどうかによって決まります。多くのデバイスは、アプリケーション プロセッサに組み込まれた LCD コントローラを使用しますが、通常はアクセラレーションを行いません。
バッチ処理を無効にし、制限を 1 に設定することで、デスクトップで CE の動作をシミュレートできますGdiSetBatchLimit
。また、SVGA グラフィックス ドライバーを使用してアクセラレーションを無効にすることも検討してください。Windows Vista または Windows 7 では、Aero 環境を使用している場合、GDI は高速化されません。すべての操作はソフトウェアで実装されますが、Windows 7 では新しいビットブリット ハードウェア アクセラレーション機能が追加されています。
Windows CE 6.0 には新しいカーネルとプロセス モデルがあり、デスクトップ Windows (Vista 以前) と同様に GDI をカーネル モードに移行するため、GDI 関数を呼び出すコストはわずかに削減されます。まだバッチ処理はありません。