Domanda

Sto confrontando un'applicazione WPF su varie piattaforme e ho bisogno di un modo semplice per determinare se WPF utilizza il rendering hardware o software.

Mi sembra di ricordare una chiamata per determinarlo, ma al momento non riesco a mettere le mani su di esso.

Inoltre, esiste un modo semplice basato su codice per forzare una pipeline di rendering sull'altra?

È stato utile?

Soluzione

Controlla RenderCapability.Tier

[ Aggiorna ]

  • RenderCapability.IsPixelShaderVersionSupported - Ottiene un valore che indica se la versione di pixel shader specificata è supportata.
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - Ottiene un valore che indica se il sistema può eseguire il rendering degli effetti bitmap nel software.
  • RenderCapability.Tier : ottiene un valore che indica il livello di rendering per il thread corrente.
  • RenderCapability.TierChanged : si verifica quando il livello di rendering è cambiato per l'oggetto Dispatcher del thread corrente.

RenderCapability.Tier > > 16

  • Livello di rendering 0 : nessuna accelerazione dell'hardware grafico. Il livello di versione di DirectX è inferiore alla versione 7.0.
  • Rendering livello 1 - Accelerazione hardware grafica parziale. Il livello di versione di DirectX è maggiore o uguale alla versione 7.0 e inferiore alla versione 9.0.
  • Rendering di livello 2 : la maggior parte delle funzionalità grafiche utilizza l'accelerazione hardware grafica. Il livello di versione di DirectX è maggiore o uguale alla versione 9.0.

Altri suggerimenti

.NET 4.0 offre la possibilità di forzare il rendering del software nel codice:

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

Vedi questo post per ulteriori informazioni.

Basato sul RenderingPier link , ecco un po 'di codice:

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

Sto ancora testando e lavorando su questo. Vedi le modifiche / risposte future per quello che trovo.

Forse quanto segue può aiutare con la seconda parte della tua domanda, ovvero puoi forzare una pipeline di rendering su un'altra:

È possibile modificare le impostazioni del registro per disabilitare l'accelerazione hardware e forzare il rendering del software in qualsiasi momento. Usiamo spesso questo per vedere se un particolare problema che stiamo vedendo ... è legato ai driver video. Come esempio di ciò di cui sto parlando, vedi questo post sul forum WPF .

Una cosa ovvia da notare qui però ... è che questo influenza tutte le applicazioni WPF e dovrebbe davvero essere usato solo a scopo di test.

Per disabilitare l'accelerazione hardware:

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

Per abilitare l'accelerazione hardware:

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

Dai un'occhiata a questo collegamento MSDN per maggiori informazioni.

Oppure usa Strumenti di profilazione ...

  

È stata aggiunta una nuova casella di controllo per colorare gli elementi dell'applicazione di destinazione che utilizzano effetti bitmap legacy resi SW.

Sono d'accordo con la seconda risposta, ma questo dice solo qualcosa sulla capacità della macchina di funzionare usando il rendering hw non se l'app è effettivamente resa hw.

Ho creato una semplice app usando un'area di disegno e solo ruotando un rettangolo con RotateTransform si usa la maggior parte della CPU per un'applicazione renderizzata in hw. Questo e il valore "RenderCapability.Tier" è 2, quindi c'è abbastanza capacità hw per farlo.

Perché allora no?

Per rispondere alla seconda metà della tua domanda, non credo sia davvero possibile forzare un modo sull'altro. Il rendering hardware viene utilizzato automaticamente se disponibile, altrimenti il ??software lo è.

Se è necessario testarlo in modalità Software, è necessario utilizzare un computer con specifiche basse o utilizzare Desktop remoto per visualizzare l'applicazione in esecuzione su un altro computer. A parte le prestazioni / framerate ridotte, tuttavia, non dovrebbero esserci differenze visibili nell'aspetto tra i due. Usa la classe RenderCapability per sapere se dovresti disabilitare cose come l'animazione o gli effetti a favore della performance.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top