2

多くのベクターグラフィックを使用するWindowsCEアプリケーションがあり、場所によっては非常に低速です。私は現在、フリッカーフリーリフレッシュ用のビットマップを介したレンダリングにGDIを使用しています。通常、私は大きな3Dマップの一部をウィンドウ表示しています。一部のデバイス(166mhz SH4など)では、大きなデータセットの場合、これは3〜5秒の更新時間で遅くなります。私の質問はこれです。

  • WindowsMo​​bileとWin32のグラフィック操作の相対速度を比較した人はいますか。別の言い方をすれば、WinCEバージョンに適用可能なソフトウェアのWin32バージョンからのプロファイリング結果は、GDI呼び出しのみを調べていると仮定しています。

  • WinCEプラットフォーム(C ++アプリ)でオンボードのプロファイリングを試した人はいますか?はいの場合、どのツールを使用しますか?

  • WindowsCEでの描画速度を向上させる方法を知っている人はいますか。私は現在、前の質問からのフィードバックに続いてFastGraphを見ていますが、これは少し長期的な解決策です。悪いことですが、次のリリースに向けてより高速に実装できるものを探しています。

4

3 に答える 3

5

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 回だけタッチするようにし、無効な領域を利用して再描画が必要な画面の部分のみを描画します ( GetUpdateRgnorを使用して、領域を有効としてマークする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 関数を呼び出すコストはわずかに削減されます。まだバッチ処理はありません。

于 2011-08-14T10:43:04.093 に答える
2

私はグラフィックスの側面についてあまり知識がありませんが、経験から、特定のハードウェア関連のことで速くなりたい場合は、「金属」に近づくほど速くなります (そして難しくなります! )。そのため、 Direct DrawまたはDirect 3Dの使用を検討できます(D3D をドロップして、WM7 の OpenGL ES に移行していると思います)。ゲーム開発者の使用方法を調べることができます。

プロファイルの問題については、何も見つかりませんでしたが、独自に作成しています。

于 2009-03-10T05:57:05.413 に答える
1

私はこの種のベンチマークをたくさん行ってきましたが、GDI 操作は通常の Win32 よりも WinCE で遅くなりますが、WinCE デバイスの遅いプロセッサに比例して遅くなるだけです。言い換えれば、WinCE で GDI を使用することによる追加のパフォーマンス ヒットはないようです。

申し訳ありませんが、最後の 2 つの質問に対する回答がありません。

于 2009-03-04T12:22:11.887 に答える