2010-05-03 13 views
7

Ho bisogno di rendere migliaia di ellissi collegate le une alle altre con linee. Quale sarebbe il modo migliore (in termini di prestazioni) per renderlo all'interno di un'applicazione WPF. La pittura su tela WPF è molto peggiore della pittura XNA?WPF vs XNA per il rendering di migliaia di sprite

In realtà, la domanda nascosta è: è possibile eseguire qualche xna-rendering all'interno di un host WPF? Ho visto alcuni esempi che hanno usato una finestra senza bordi XNA sovrapposizione, ma non soluation nativo ...

Grazie, Aurélien

risposta

2

Se fatto bene, è possibile ottenere prestazioni piuttosto elevate nel rendering WPF che ha il vantaggio che non è necessario prendere il dolore di interoperabilità WPF-XNA. Puoi eseguire il rendering (e animare) una grande quantità di elementi visivi se utilizzi le API di rendering a basso livello di WPF come CompositionTarget.Rendering e DrawingContext. Puoi anche sfruttare il nuovo Cached Composition feature in .net 4.0. C'è molto di più basta prendere questo come punto di partenza.

+0

Penso che andrò in questo modo, ma ho bisogno di un po 'di interattività con ogni ellisse, e sono resi in un ScrollViewer. In realtà, attualmente sto usando un controllo per eseguire il rendering di un'ellisse e un altro controllo per il rendering di una linea. Questo è solo per il prototipo, e le esibizioni con più di cento ellissi sono orribili. Grazie. Penso che andrò con DrawingVisuals ... –

+1

DrawingVisuals sono molto più veloci dei controlli derivati ​​da Shape (Line, Ellipse), ma per il contenuto dinamico il suggerimento DrawingContext di bitbonk può essere ancora più veloce. –

1

Ho appena trovato this article su CodeProject:

Vogliamo integrare la nostra scena XNA in un'interfaccia utente WPF nello stesso modo in cui integriamo una tela o qualsiasi widget. Ma il modo migliore per visualizzare una scena 3D in XNA è incorporarlo in una finestra. È impossibile ottenere l'handle di qualsiasi controllo WPF come si può fare con un WinForm. Il trucco è quindi riscrivere parte del framework XNA che ruota intorno alla classe Game. L'obiettivo è ereditare una nuova classe di gioco da Panel (nel nostro caso, una tela) per poterla includere nell'albero visuale di WPF. I limiti visivi del pannello saranno l'area di visualizzazione della scena XNA. Tuttavia, abbiamo appena detto che non è possibile ottenere un handle per un controllo visivo che non eredita da Window. Come possiamo visualizzare il 3D con XNA allora? Mostreremo semplicemente una finestra senza bordo appena sopra il pannello. Questa finestra sarà sempre in primo piano quando l'applicazione ha il focus e il pannello è visibile e sarà nascosto in questo caso. Allo stesso modo, quando il pannello non è visibile, fermeremo l'attività del gioco.

This thread sui forum Microsoft ha una discussione su questo e un poster stati:

Poi, le conclusioni è che si può avere XNA il rendering in una forma WPF senza problemi ma si deve evitare l'uso le classi Game e GraphicsDeviceManager in quanto quest'ultima richiede l'esecuzione di un'istanza di gioco (il costruttore è definito come nuovo GraphicsDeviceManager (gioco di gioco)) e la classe Game non fornisce alcun modo per definire la finestra su cui esegue il rendering.

Quindi sembra possibile, ma richiede un po 'di lavoro sul lato XNA dell'equazione.

2

Ho "integrato" con successo XNA con WPF eseguendo il rendering di una scena XNA su un controllo WinForms e quindi ospitando tale controllo in WPF utilizzando the WindowsFormsHost element.

+0

Volevo farlo, ma ho sentito che le esibizioni sono schiacciate in un host di vittorie. Indovina che sono solo voci, dovrò testare questa ipotesi. –

+0

Sì, questa ipotesi deve essere testata :) Sto facendo girare una scena triangoli di 60k + con prestazioni accettabili. Sto usando 'BasicEffect' con una fonte di luce e nebbia attivata, non ho ancora provato le trame. Ma suppongo che il sovraccarico di passare attraverso WinForms dovrebbe essere costante, indipendentemente da ciò che sta succedendo sul lato XNA. –

+0

In effetti il ​​sovraccarico di rendering di passare attraverso WinForms è esattamente zero (rispetto a una finestra di sovrapposizione). Sotto il cofano, sia il metodo WinForms che la finestra overlay danno a Direct3D un'area di schermo rettangolo di cui possedere e giocare. Il ridimensionamento e lo spostamento della finestra saranno tecnicamente più lenti, ma in pratica in modo inequivocabile. –

1

Tuttavia, le applicazioni XNA non eseguiranno su sistemi senza almeno 1,1 GPU shader.

Problemi correlati