30


13

私はさまざまなプラットフォームでWPFアプリケーションをベンチマークしているので、WPFがハードウェアレンダリングとソフトウェアレンダリングのどちらを使用しているかを判断する簡単な方法が必要です。

私はこれを決定するための電話を思い出したようですが、今私の手を置くことはできません。

また、一方のレンダリングパイプラインを他方のレンダリングパイプラインに強制する簡単なコードベースの方法はありますか。

7 Answer


34


RenderCapability.Tierを確認してください。

{空} [* UPDATE *]

  • * RenderCapability.IsPixelShaderVersionSupported * - 指定されたピクセルシェーダバージョンがサポートされているかどうかを示す値を取得します。

  • * RenderCapability.IsShaderEffectSoftwareRenderingSupported * - システムがソフトウェアでビットマップ効果をレンダリングできるかどうかを示す値を取得します。

  • * RenderCapability.Tier * - 現在のスレッドのレンダリング層を示す値を取得します。

  • * RenderCapability.TierChanged * - 現在のスレッドのDispatcherオブジェクトのレンダリング層が変更されたときに発生します。

  • RenderCapability.Tier >> 16 *

  • * Rendering Tier 0 * - グラフィックハードウェアアクセラレーションはありません。 DirectXのバージョンレベルがバージョン7.0未満です。

  • *レンダリングTier 1 * - 部分的なグラフィックハードウェアアクセラレーション。 DirectXのバージョンレベルは、バージョン7.0以上、バージョン9.0未満です。

  • * Rendering Tier 2 * - ほとんどのグラフィック機能はグラフィックハードウェアアクセラレーションを使用しています。 DirectXのバージョンレベルは、バージョン9.0以上です。


11


NET 4.0 provides the ability to force software rendering in code:
パブリック部分クラスApp:Application {protectedオーバーライドvoid OnStartup(StartupEventArgs e){if(WeThinkWeShouldRenderInSoftware())RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; }}

詳細については この投稿を参照してください。


6


https://stackoverflow.com/questions/149763/how-do-you-determine-if-wpf-is-using-hardware-or-software-rendering#149802[RenderingTierリンク]に基づいて、以下はいくつかのコードです。
logger.InfoFormat( "WPF Tier = {0}"、RenderCapability.Tier / 0x10000); RenderCapability.TierChanged =(送信者、引数)=> logger.InfoFormat( "WPF層が{0}に変更されました"、RenderCapability.Tier / 0x10000);

私はまだこれをテストして取り組んでいます。 私が見つけたものについては、今後の編集/回答を参照してください。


6


おそらく、次のことが質問の後半部分に役立ちます。つまり、あるレンダリングパイプラインを別のレンダリングパイプラインに強制することができます。

レジストリ設定を変更してハードウェアアクセラレーションを無効にし、ソフトウェアレンダリングを常に実行させることができます。 私たちはよく見ている特定の問題かどうかを確認するためにこれを使います…​ ビデオドライバに関連しています。 私が話していることの例として、この WPFフォーラムの投稿を参照してください。

ここで注意すべき1つの明白なことが…​ これは*すべての* WPFアプリケーションに影響するので、実際にはテスト目的でのみ使用する必要があります。

ハードウェアアクセラレータを無効にするには

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration" = dword:00000001

ハードウェアアクセラレーションを有効にするには

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration" = dword:00000000

詳細については、この MSDNリンクを参照してください。


4


またはhttp://windowsclient.net/wpf/perf/wpf-perf-tool.aspx[Profiling Tools]を使用してください。

_ 新しいチェックボックスが追加され、SWレンダリングされたレガシービットマップ効果を使用するターゲットアプリケーション要素の色合いが変わりました。 _


1


あなたの質問の後半に答えるために、私が本当に一方を他方に強制すると信じる方法はありません。 利用可能な場合はハードウェアレンダリングが自動的に使用され、それ以外の場合はソフトウェアが使用されます。

ソフトウェアモードでテストする必要がある場合は、低スペックのマシンを使用するか、リモートデスクトップを使用して別のコンピュータで実行されているアプリケーションを表示する必要があります。 パフォーマンスやフレームレートの低下を除けば、この2つの外観に目に見える違いはありません。 RenderCapabilityクラスを使用して、パフォーマンスを優先してアニメーションや効果などを無効にする必要があるかどうかを確認します。


1


私は2番目の答えに同意しますが、それは単にアプリが実際にhwレンダリングされている場合ではなく、hwレンダリングを使用して実行するマシンの能力に関する何かを言っているだけです。

キャンバスを使用して簡単なアプリを作成し、RotateTransformを使用して長方形を回転させるだけで、hwレンダリングされたアプリケーションのために多くのCPUを使用できます。 それと 'RenderCapability.Tier’の値は2なので、それを実行するための十分なhw機能があります。

それならどうしてですか?