32

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

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

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

4

7 に答える 7

36

RenderCapability.Tier を確認する

[更新]

  • 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 以上です。
于 2008-09-29T17:39:21.500 に答える
13

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

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

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

于 2010-05-19T15:56:04.933 に答える
6

おそらく、次のことが質問の 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 リンクを確認してください。

于 2008-10-01T14:27:35.483 に答える
6

RenderingTier linksに基づいて、いくつかのコードを次に示します。

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

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

于 2008-09-29T18:26:47.143 に答える
4

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

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

于 2008-09-29T18:14:45.237 に答える
1

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

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

于 2008-10-01T06:20:28.667 に答える
1

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

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

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

于 2009-07-17T09:35:33.153 に答える