WPFがハードウェアレンダリングを使用しているかソフトウェアレンダリングを使用しているかをどのように判断しますか?
質問
さまざまなプラットフォームでWPFアプリケーションのベンチマークを行っていますが、WPFがハードウェアレンダリングを使用しているかソフトウェアレンダリングを使用しているかを簡単に判断する方法が必要です。
これを決定するための呼び出しを思い出すようですが、今すぐそれに手を置くことはできません。
また、あるレンダリングパイプラインを他のレンダリングパイプラインに強制する簡単なコードベースの方法はありますか?
解決
RenderCapability.Tierを確認します
- http://msdn.microsoft.com/library/ ms742196(v = vs.100).aspx
- http://msdn.microsoft.com/ en-us / library / system.windows.media.rendercapability_members.aspx
[更新]
- RenderCapability.IsPixelShaderVersionSupported -指定されたピクセルシェーダーバージョンがサポートされているかどうかを示す値を取得します。
- RenderCapability.IsShaderEffectSoftwareRenderingSupported -システムがソフトウェアでビットマップ効果をレンダリングできるかどうかを示す値を取得します。
- RenderCapability.Tier -現在のスレッドのレンダリング層を示す値を取得します。
- RenderCapability.TierChanged -現在のスレッドのDispatcherオブジェクトのレンダリング層が変更されたときに発生します。
RenderCapability.Tier>> 16
- レンダリング層0 -グラフィックハードウェアアクセラレーションなし。 DirectXのバージョンレベルはバージョン7.0未満です。
- レンダリング層1 -部分的なグラフィックスハードウェアアクセラレーション。 DirectXのバージョンレベルは、バージョン7.0以上、バージョン9.0以下です。
- レンダリング層2 -ほとんどのグラフィック機能はグラフィックハードウェアアクセラレーションを使用します。 DirectXバージョンレベルは、バージョン9.0以上です。
他のヒント
.NET 4.0は、コードでソフトウェアレンダリングを強制する機能を提供します。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
この投稿」を参照してください。
に基づくRenderingTierリンク、次のコードがあります:
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
私はまだテストと作業を行っています。見つけたものの今後の編集/回答を参照してください。
次の質問の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リンクをご覧ください。
>またはプロファイリングツール ...
SWでレンダリングされたレガシービットマップエフェクトを使用するターゲットアプリケーション要素の色合いを調整するための新しいチェックボックスが追加されました。
2番目の答えには同意しますが、アプリが実際にハードウェアレンダリングされている場合ではなく、ハードウェアレンダリングを使用して実行するマシンの能力について何かを言っています。
キャンバスを使用して簡単なアプリを作成し、RotateTransformで四角形を回転させるだけで、ハードウェアレンダリングされたアプリケーションのCPUを使用します。それと 'RenderCapability.Tier'の値は2なので、それを行うのに十分なハードウェア機能があります。
なぜそうしないのですか?
あなたの質問の後半に答えるために、ある方法を他の方法に強制することは本当に信じられません。ハードウェアレンダリングが使用可能な場合は自動的に使用され、そうでない場合はソフトウェアが使用されます。
ソフトウェアモードでテストする必要がある場合は、低スペックのマシンを使用するか、リモートデスクトップを使用して別のコンピューターで実行されているアプリケーションを表示する必要があります。ただし、パフォーマンス/フレームレートの低下は別として、両者の外観に目に見える違いはありません。 RenderCapabilityクラスを使用して、パフォーマンスを優先してアニメーションやエフェクトなどを無効にする必要があるかどうかを確認します。