さまざまなプラットフォームで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つは、これはallWPFアプリケーションに影響し、実際にはテスト目的でのみ使用する必要があるということです。
ハードウェアアクセラレーションを無効にするには:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001
ハードウェアアクセラレーションを有効にするには:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000
詳細については、これをチェックしてください MSDNリンク 。
RenderingTierリンク に基づいて、ここにいくつかのコードがあります:
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なので、それを実行するのに十分なハードウェア機能があります。
なぜそうしないのですか?