2010-03-26 24 views
14

So che WPF è più complesso e flessibile, quindi si potrebbe pensare a fare più calcoli. Ma dal momento che il rendering viene eseguito sulla GPU, non sarebbe più veloce di Winforms per la stessa applicazione (funzionalmente e visivamente)?Quale ha prestazioni di runtime più veloci: WPF o Winforms?

Voglio dire che quando non si esegue alcun gioco o rendering 3D pesante, la GPU non sta facendo un lavoro pesante, giusto? Mentre la CPU è sempre occupata.

È un'ipotesi valida o l'utilizzo della GPU di WPF è un'operazione molto piccola nella sua pipeline?

EDIT: L'applicazione che mi interessa è un software di modellazione e animazione 3D, in cui si hanno finestre 3D per navigare e modificare la scena e gli oggetti all'interno della scena. Ma voglio usare WPF per la sua architettura moderna, ed è da zero.

EDIT2: Anche per i miei scopi userò DirectX mani giù per l'app stessa a causa dei requisiti di fascia alta del software. Per quanto riguarda le persone che utilizzano la fascia bassa o computer senza una GPU dedicata, va bene perché non sono nella mia area cliente principale. Proprio come gli altri software 3d di fascia alta per film e giochi, sarà comprensibile richiedere un potente computer per beneficiare pienamente dell'applicazione.

+1

Essa dipende dalle applicazioni. – SLaks

+0

Scusate dovrebbe aggiungere più dettagli allora. –

+0

Non sono esperto, ma credo che l'hardware esatto (e i driver corrispondenti) possano avere un'influenza significativa anche sulle prestazioni. –

risposta

18

Se la macchina dispone di una GPU, otterrete prestazioni di rendering migliori in WPF.

Abbiamo una grande applicazione desktop che abbiamo scritto in WinForms e ora stiamo eseguendo il porting su WPF. Abbiamo assistito a prestazioni di rendering molto migliori, in particolare durante il ridimensionamento dei controlli di Windows o di ridisegno.

Abbiamo anche scoperto che i "controlli" WPF sono più leggeri dei controlli WinForm. Se ricordo bene, i controlli WPF non richiedono necessariamente un handle del sistema operativo e non si registrano per i messaggi della finestra di Windows tramite WndProc, almeno non in modo indipendente.

Per il tuo caso, dal momento che stai costruendo un'app di modellazione 3d, che presuppone un certo hardware 3d sulla macchina, devi assolutamente usare WPF su WinForms.

+0

Grazie, anche dal momento che WPF usa anche la GPU, ci sarebbe uno scontro tra l'applicazione e il WPT stesso nell'utilizzo di tale risorsa? –

+1

Non più di quanto sarebbe se avessi il tuo sistema di menu 2d in cima alla tua app 3d. In effetti, WPF probabilmente lo farà in modo più efficiente. :) –

6

Questa è una domanda davvero difficile a cui rispondere.

Una parte enorme delle prestazioni WPF è la GPU. Una buona GPU fa miracoli per far funzionare bene WPF. WPF può essere molto performante. Se le tue esigenze sono di avere una GPU decente, dal momento che si tratta di un programma di modellazione 3D, probabilmente le prestazioni WPF saranno migliori o migliori di quelle di Windows Form, anche se questo dipende molto da cosa stai usando.

Detto questo, di solito è difficile confrontare - soprattutto perché WPF ti consente di aggiungere molti effetti visivi che le persone tendono a non tentare mai nemmeno in Windows Form. Molte applicazioni WPF "sembrano" più veloci anche se in alcuni casi sono più lente a causa di ulteriori indizi visivi.

Detto questo, se si dispone di un sacco di controlli, WPF può effettivamente sovraperformare Windows Form di una certa quantità. In Windows Form, ciascun controllo richiede un handle di finestra separato e riceve i propri set di messaggi. Con un sacco di controlli, questo può effettivamente rallentare le cose in modo drammatico.

La vera domanda qui dovrebbe essere WPF perf. "abbastanza buono" per la tua applicazione. Se stai facendo un'applicazione di modellazione 3D, è probabile che WPF non sarà il collo di bottiglia, dovrebbe andare bene.

+0

Grazie, qual è il sovraccarico di richiedere un handle di finestra separato che sta accadendo in Winforms? Inoltre dal momento che WPF usa anche la GPU, ci sarebbe una lotta tra l'applicazione e WPT stesso nell'utilizzo di quella risorsa? –

+1

@Joan: Ogni handle di finestra deve ricevere messaggi separati tramite la pompa messaggi. Se crei uno schermo con centinaia di controlli, è davvero troppo scarso in Windows Form, specialmente se è richiesto il rendering personalizzato. Per quanto riguarda "combattere" - non proprio. Ricorda, Vista + W7 usa la scheda grafica per TUTTO il rendering desktop: le GPU moderne sono abbastanza buone per gestirlo. Io faccio sci. software/modellazione 3d, e utilizzare WPF esclusivamente per i nostri nuovi prodotti, e adoro il perf. –

+0

Grazie Reed. Pensare bene. Inoltre le tue app sono disponibili online? Stavo chiedendo sarebbe bello vedere solo uno screenshot anche: O –

2

Per la modellazione 3D, WPF è chiaramente una scelta molto migliore rispetto a WinForms, ma è ancora lontano dall'ideale. Winforms non ha alcun supporto (diretto) per il rendering 3D, e WPF ne ha alcuni.Per un programma che si rivolge principalmente al rendering 3D, tuttavia, potresti stare meglio con qualcosa di specifico dedicato alle attività di rendering 3D, come OpenGL o Direct3D.

Da soli, nessuno di questi offre un enorme vantaggio rispetto WPF, ma a meno che quello che stai facendo è abbastanza specializzato, non vorrei usare quelli direttamente però. Mi piacerebbe usare qualcosa come OpenSceneGraph o Ogre3D, che può utilizzare uno di questi per la sua resa, ma fornisce un'interfaccia di livello superiore tanto e fa più per gestire il rendering scena.

Uno o entrambi questi probabilmente potrebbero usare WPF per il disegno vero e proprio - ma sono abbastanza sicuro che nessuno lo fa, almeno al momento. Non so se lo faranno mai - potrebbero, ma dubito che sia una vera priorità, dal momento che già supportano OpenGL e Direct3D. Per i loro scopi, WPF offre un piccolo vantaggio.

+0

Grazie, sì è un'app abbastanza specializzata nel modo in cui gestisce le cose. In questo momento voglio solo supportare Windows, quindi rimarrò su DirectX. So che WPF ha funzionalità 3d, ma non penso che sia qualcosa di competere con DirectX se non sbaglio. Ma tutta l'interfaccia utente, ecc ho intenzione di utilizzare WPF. –

+1

Anche se OpenGL è anche portatile, il motivo principale per preferirlo a DirextX è che semplicemente * così * molto più bello con cui lavorare. –

1

Visto che WPF lo utilizza DirectX sotto il cofano e il fatto che si utilizza XAML per specificare gli oggetti DirectX, WPF è di gran lunga la soluzione più semplice.

Example coding a camera in xaml:

<PerspectiveCamera x:Key="Camera" 
Position="0, 0, 4" 
LookDirection="0, 0, -4" 
UpDirection="0, 1, 0" 
FieldOfView="30"/> 
+0

Grazie, quindi vuoi dire che posso accedere all'intero DirectX SDK usando XAML? Stavo pensando di usare SlimDX per le cose 3d. –

+0

Grazie, ha senso. –

+0

Una parola di avvertimento: anche se ho trovato il materiale 3D WPF fantastico, non c'è un buon modo per rendere effettivamente il contenuto 3D a un bitmap, quindi se avessi bisogno di esportare le tue scene 3D, io andrei con SlimDX per la porzione 3D. Vedi http://stackoverflow.com/questions/2179042/rendertargetbitmap-and-viewport3d-quality-issues per maggiori informazioni. – Grokys

7

Per lo scenario app che lei descrive, mi sarei aspettato di WPF a sovraperformare WinForms per il lavoro 3D su una GPU piena funzionalità con un ampio margine.

La differenza tra i tipi di applicazioni è molto più che la rende la pipeline vettoriale 3D. L'architettura interna di WPF è radicalmente diversa da WinForms, progettata specificamente per superare le avvertenze acquisite da anni di esperienza precedente con le app Windows GDI e WinForms.

(WinForms è un wrapper relativamente sottile intorno a Windows GDI e il modello d'uso che è stato originariamente creato alla fine del 1980. Il modello di controllo utente di Windows si è evoluta nel corso degli ultimi 25 anni, ma i modelli architettonici di base sono in gran parte invariato.)

Ad esempio, WPF separa sempre resa UI dalla logica applicativa. Quando la finestra WPF va a disegnare qualcosa, il rendering effettivo avviene su un thread in background. Le immagini aggiornate vengono capovolte sul display durante l'intervallo di ritracciamento del video, in modo da non ottenere scoppi parziali o artefatti "strappanti" sullo schermo.

WinForms fa niente di tutto questo. Se si esegue il rendering di DirectX o OpenGL una superficie in un app WinForms, si deve fare il lavoro di sfogliare pagina del video e fare in modo che succede al momento giusto per evitare artefatti screen tearing.

controlli predefiniti di WPF sono GPU consapevoli e possono essere personalizzati in stile con bagliori e trasparenze e quant'altro tutto GPU accelerata. I controlli di WinForms non traggono alcun vantaggio significativo dalle funzionalità della GPU, dal momento che circa le sole cose che WinForms (controlli utente di Windows) usa per il rendering sono bitmap 2D e riempimento rettangolo. Bagliori, la trasparenza, le animazioni sono tutte possibili con WinForms, ma devi fare tutto il lavoro per la loro attuazione.

In WPF, interfaccia utente slickness è soprattutto una questione di progettazione e styling per ottenere WPF a farlo per voi. In WinForms, devi spingere i pixel da solo.

+0

Tre sono almeno una cosa piccola, ma brutta con WPF su Windows XP. Questo è risolto in Vista e fino, quindi morde le persone che utilizzano una versione integrata di Windows (non c'è RTM oltre a XP). L'artefatto sta perdendo la sincronia verticale quando si realizzano animazioni a contrasto elevato, persino qualcosa come la riproduzione di un file MPEG ad alto contrasto. –

+0

Se si deve supportare WinXP o versioni precedenti, non raccomanderei comunque l'uso di WPF. Solo perché il framework può tecnicamente eseguire lì non significa che funzionerà bene. ;> – dthorpe

+0

Allora non c'era Windows Vista Embedded, solo Windows XP Embedded :) Windows 7 Embedded è arrivato anni dopo ... –

Problemi correlati