質問

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

  • Windows MobileとWin32でのグラフィック操作の相対的な速度を誰もが比較しました。別の言い方をすれば、WinCEバージョンに適用可能なソフトウェアのWin32バージョンからの結果をプロファイリングしているのは、GDI呼び出しのみを見ているという前提です。

  • WinCEプラットフォーム(C ++アプリ)でオンボードのプロファイリングを試みた場合、そうであれば、どのツールを使用します。

  • Windows CEで描画速度を改善する方法を知っている人はいますか。私は現在、前の質問からのフィードバックに従ってFastGraphを見ています。しかし、これは少し長い期間のソリューションです。悪いことばかりですが、今後のリリースで実装するためのより高速なものを探しています。

役に立ちましたか?

解決

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呼び出しではなく、ポリラインを検討してください。重複するオブジェクトをレンダリングするのではなく、各ピクセルを1回だけタッチし、再描画が必要な画面の部分のみをペイントするために無効な領域を使用するようにします( GetUpdateRgn または GetUpdateRect を使用しますが、領域を有効としてマークする BeginPaint を呼び出す前に実行してください。

CEグラフィックアクセラレーションモデルはかなり基本的で、ビットブリットに基づいています。 Windows 2000モデルのデスクトップデバイスドライバーがサポートするより大きな機能セットはサポートしていません。アクセラレーションが利用可能かどうかは、ハードウェアにアクセラレータチップが搭載されているかどうかに依存します。多くのデバイスは、アプリケーションプロセッサに組み込まれたLCDコントローラーを使用します。

バッチを無効にして、 GdiSetBatchLimit を使用して制限を1に設定することにより、デスクトップでCEの動作をシミュレートできます。また、SVGAグラフィックドライバーを使用して加速を無効にすることを検討してください。 Windows VistaまたはWindows 7では、Aero環境を使用している場合、GDIは高速化されません。すべての操作はソフトウェアで実装されますが、Windows 7はいくつかの新しいビットブリットハードウェアアクセラレーション機能を追加しました。

Windows CE 6.0には、デスクトップWindows(Vistaより前)のようにGDIをカーネルモードに移行する新しいカーネルとプロセスモデルがあるため、GDI関数を呼び出すコストをわずかに削減する必要があります。バッチ処理はまだありません。

他のヒント

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

プロフィールの質問では、何も見つかりませんでしたが、所有

この種のベンチマークを多く行いましたが、WinCEでのGDI操作は通常のWin32よりも遅くなりますが、WinCEデバイスのプロセッサが遅いほど比例します。言い換えると、WinCEでGDIを使用しても、パフォーマンスがさらに低下することはないようです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top