さまざまなプラットフォームでWPFアプリケーションのベンチマークを行っていますが、WPFがハードウェアまたはソフトウェアのレンダリングを使用しているかどうかを簡単に判断する方法が必要です。
これを決定するための電話を思い出したようですが、今はそれを手に入れることができません。
また、一方のレンダリングパイプラインをもう一方のレンダリングパイプラインに強制する簡単なコードベースの方法はありますか?
RenderCapability.Tier を確認する
[更新]
RenderCapability.Tier >> 16
.NET 4.0 は、コードでソフトウェア レンダリングを強制する機能を提供します。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
詳細については、この投稿を参照してください。
おそらく、次のことが質問の 2 番目の部分に役立つ可能性があります。つまり、あるレンダリング パイプラインを別のレンダリング パイプラインに強制できますか。
レジストリ設定を変更して、ハードウェア アクセラレーションを無効にし、ソフトウェア レンダリングを常に強制的に実行することができます。これは、発生している特定の問題がビデオ ドライバーに関連しているかどうかを確認するためによく使用されます。私が話していることの例として、このWPF フォーラムの投稿を参照してください。
ただし、ここで注意すべき明らかなことの 1 つは、これはすべてのWPF アプリケーションに影響し、実際にはテスト目的でのみ使用する必要があるということです。
ハードウェア アクセラレーションを無効にするには:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001
ハードウェア アクセラレーションを有効にするには:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000
詳細については、このMSDN リンクを確認してください。
RenderingTier linksに基づいて、いくつかのコードを次に示します。
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
私はまだこれをテストして取り組んでいます。私が見つけたものについては、今後の編集/回答を参照してください。
または、プロファイリング ツールを使用します...
SW でレンダリングされた従来のビットマップ効果を使用するターゲット アプリケーション要素を着色するための新しいチェックボックスが追加されました。
あなたの質問の後半に答えるために、一方の方法を他方の方法よりも強制する方法はないと私は信じています。利用可能な場合はハードウェア レンダリングが自動的に使用され、そうでない場合はソフトウェアが使用されます。
ソフトウェア モードでテストする必要がある場合は、低スペックのマシンを使用するか、リモート デスクトップを使用して、別のコンピューターで実行されているアプリケーションを表示する必要があります。ただし、パフォーマンス/フレームレートの低下は別として、2 つの外観に目に見える違いはないはずです。RenderCapability クラスを使用して、パフォーマンスのためにアニメーションや効果などを無効にする必要があるかどうかを確認します。
私は2番目の答えに同意しますが、アプリが実際にハードウェアレンダリングされている場合ではなく、ハードウェアレンダリングを使用してマシンを実行する能力について何かを言っているだけです。
キャンバスを使用して単純なアプリを作成し、RotateTransform で四角形を回転させるだけで、ハードウェア レンダリングされたアプリケーションに多くの CPU を使用します。それと「RenderCapability.Tier」の値は 2 であるため、それを行うのに十分なハードウェア機能があります。
なぜそうしないのですか?