web-dev-qa-db-ja.com

WPFがハードウェアレンダリングとソフトウェアレンダリングのどちらを使用しているかをどのように判断しますか?

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

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

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

31
Chasler

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

[[〜#〜]更新[〜#〜]]

  • RenderCapability.IsPixelShaderVersionSupported-指定されたピクセルシェーダーバージョンがサポートされているかどうかを示す値を取得します。
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported-システムがソフトウェアでビットマップ効果をレンダリングできるかどうかを示す値を取得します。
  • RenderCapability.Tier-現在のスレッドのレンダリング層を示す値を取得します。
  • RenderCapability.TierChanged-現在のスレッドのDispatcherオブジェクトのレンダリング層が変更されたときに発生します。

RenderCapability.Tier >> 16

  • レンダリングTier 0-グラフィックハードウェアアクセラレーションなし。 DirectXのバージョンレベルはバージョン7.0未満です。
  • Tier 1のレンダリング-部分的なグラフィックハードウェアアクセラレーション。 DirectXのバージョンレベルはバージョン7.0以上で、バージョン9.0未満です。
  • Tier 2のレンダリング-ほとんどのグラフィック機能はグラフィックハードウェアアクセラレーションを使用します。 DirectXのバージョンレベルはバージョン9.0以上です。
34
rudigrobler

.NET 4.0は、コードでソフトウェアレンダリングを強制する機能を提供します。

public partial class App : Application 
{    
    protected override void OnStartup(StartupEventArgs e)    
    {         
        if (WeThinkWeShouldRenderInSoftware())            
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;    
    }
}

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

11
user259509

おそらく、次のことが質問の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リンク

6
cplotts

RenderingTierリンク に基づいて、ここにいくつかのコードがあります:

        logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
        RenderCapability.TierChanged +=
            (sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
                                                RenderCapability.Tier / 0x10000);

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

6
Chasler

または、 プロファイリングツール ..を使用します。

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

4
rudigrobler

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

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

1
Nidonocu

私は2番目の答えに同意しますが、それは、アプリが実際にハードウェアレンダリングされている場合ではなく、ハードウェアレンダリングを使用して実行するマシンの機能について何かを示しています。

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

なぜそうしないのですか?

1
haiku