2008-09-29 321 views
30

我正在基準測試各種平臺上的WPF應用程序,我需要一種簡單的方法來確定WPF是使用硬件還是軟件渲染。如何確定WPF是使用硬件還是軟件渲染?

我似乎想起了一個電話來確定這一點,但現在不能躺在它上面。

此外,是否有一種簡單的,基於代碼的方法來強制一個渲染管道在另一個上?

回答

32

檢查RenderCapability.Tier

[UPDATE]

  • RenderCapability.IsPixelShaderVersionSupported - 獲取一個值,該值指示是否支持指定的像素着色器版本。
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - 獲取一個值,該值指示系統是否可以在軟件中呈現位圖效果。
  • RenderCapability.Tier - 獲取一個值,該值指示當前線程的呈現層。
  • RenderCapability.TierChanged - 在當前線程的Dispatcher對象的渲染層已更改時發生。

RenderCapability.Tier >> 16

  • 渲染層0 - 無圖形硬件加速。 DirectX版本級別低於版本7.0。
  • Rendering Tier 1 - 部分圖形硬件加速。 DirectX版本級別大於或等於7.0版本,小於9.0版本。
  • 渲染第2層 - 大多數圖形功能都使用圖形硬件加速。 DirectX版本級別大於或等於版本9.0。
+0

你是否在運行時以編程方式調用Rendering.Tier並檢查值? – JohnIdol 2009-09-02 18:13:39

+1

我沒有得到您列出的RenderingCapability.Tier(0,1,2)的任何值 - 我得到了131072! – JohnIdol 2009-09-03 09:04:50

+7

確定需要轉向16位 - > RenderCapability.Tier >> 16 – JohnIdol 2009-09-03 09:21:38

4

或者使用Profiling Tools ...

加入新的複選框來的色調,使用SW呈現遺留位圖效果的目標應用程序的元素。

5

基礎上RenderingTier links,這裏是一些代碼:

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

我還在測試,並在此工作。查看我發現的未來編輯/答案。

1

要回答你的問題的後半部分,我不相信真的會強迫其他方式。硬件渲染是自動使用,如果可用的話,否則,軟件是。

如果需要在軟件模式下測試它,則需要使用低規格機器或使用遠程桌面查看在另一臺計算機上運行的應用程序。然而,除了降低性能/幀率之外,兩者之間在外觀上不應有明顯差異。使用RenderCapability類來知道是否應該禁用諸如動畫或效果之類的操作來獲得性能。

6

也許下面可以用你問題的第二部分幫助,那就是你可以強制一個渲染管線對另一:

您可以更改註冊表設置來禁用硬件加速和動力軟件渲染的發生一直。我們經常用這個來看看我們看到的特定問題是否與視頻驅動程序有關。作爲我正在談論的示例,請參閱此WPF forum post

雖然這裏有一件顯而易見的事情需要注意,那就是這會影響全部 WPF應用程序,並且確實只能用於測試目的。

要禁用硬件加速:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics] 
"DisableHWAcceleration"=dword:00000001 

要啓用硬件加速:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics] 
"DisableHWAcceleration"=dword:00000000 

看看這個MSDN link獲取更多信息。

0

我同意第二個答案,但這只是說了一些關於機器使用hw渲染的能力,而不是如果應用程序實際上是渲染的。

我做了一個簡單的應用程序使用畫布,只需旋轉一個矩形與RotateTransform使用的方式很多CPU爲一個hw渲染的應用程序。這和'RenderCapability.Tier'的值是2,所以有足夠的硬件能力來做到這一點。

爲什麼不呢?

10

.NET 4.0提供了一種強制軟件渲染代碼的能力:

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

更多信息請參見this post

相關問題