2012-11-05 40 views
9

Sto per iniziare un nuovo progetto. Alcune decisioni sono fuori dal mio controllo: l'uso di WPF e OpenGL sono alcune di queste.OpenTK, SharpGL e WPF

Tuttavia, ho ristretto le opzioni OpenGL a due: O OpenTK o SharpGL. SharpGL ha un controllo WPF, mentre OpenTK ha solo un controllo Windows Form, il che rende che devo incorporarlo in un host Windows Form: -/ Anche se non mi preoccupo delle restrizioni dello spazio aereo, desidero avere prestazioni decenti , dal momento che sto costruendo un'applicazione in tempo reale. Non un gioco, ma ancora, tempo reale.

Quanta parte del rendimento del mio programma potrebbe richiedere l'utilizzo di OpenTK su un host Windows Form, rispetto all'utilizzo di SharpGL con un controllo WPF "puro"?

+0

Ho testato WinForms + DX rispetto a WPF + DX attraverso l'interoperabilità D3DImage. DX + Winforms è molto più veloce. C'è un problema di prestazioni quando si utilizza WPF D3DImage a causa della copia necessaria per integrarlo nel suo motore di rendering. Immagino che lo stesso varrebbe per OpenGL – Alan

+0

L'uso di un 'Windows Forms Host' è una soluzione sbagliata IMHO. Non puoi incorporarlo come controllo normale, perché non supporta il sovrascrittura. –

risposta

5

Quando si tratta di prestazioni, in realtà posso solo darti un'unica risposta: fai un punto di riferimento! Ma, come si sta chiedendo un'ipotesi elaborata:

SharpGl dovrebbe richiedono un passo indirezione di meno, in quanto lascia il controllo Windows Form host come un obiettivo di copiarlo sul video "intermedio". Prendi questo con un granello di sale, però, non ho né guardato la fonte né testato da solo.

Ma in pratica: le prestazioni dovrebbero essere molto simili. Alla fine della giornata le operazioni pesanti computazionali saranno probabilmente il rendering stesso, che viene fatto da OpenGL. Bloccare il risultato finale dovrebbe richiedere solo una frazione di quel tempo. Quindi spero che, comunque tu decida, nessuna di queste opzioni danneggerebbe davvero le tue prestazioni.

Per il gusto dell'argomento: Supponiamo che il rendering stesso (la parte OpenGL) impieghi 16 ms, quindi avremmo una resa teorica di circa 60 FPS. Il framework A aggiunge un sovraccarico di 1 ms, Framework B un sovraccarico di 4 ms. Anche con questa differenza piuttosto grossolana nell'overhead, il framework a dovrebbe rappresentare a ~ 58 FPS e Framework B a ~ 50 FPS. Quindi, in entrambi i casi, l'applicazione dovrebbe rimanere utilizzabile.

Ma quello che mi lascia perplesso è quanto ti stai chiedendo di questo aspetto. Alla fine stai lavorando con OpenGL e non dovrebbe essere troppo complicato per cambiare semplicemente l'implementazione sottostante nel caso le cose vadano male? Le interfacce non mi sembrano troppo diverse.

+0

Dubito che l'hit sia piccolo: WPF trae vantaggio dall'accelerazione hardware, Winforms no. –

+3

Penso che manchi il mio punto: il lavoro principale è fatto in OpenGL, che dovrebbe essere accelerato dall'hardware.Per "bridge" dall'output OpenGL, l'immagine "risultante" viene semplicemente rappresentata su varie superfici. E queste operazioni di blitting dovrebbero richiedere solo una frazione del tempo necessario per il rendering. Oh, e l'accelerazione hardware WPFs non acquista molto qui. Non penso che ci sia la possibilità di accedere all'immagine OpenGL da WPF, quindi una copia "software" deve essere fatta comunque. –

+0

Ho aggiunto alcuni numeri per rendere più chiaro il mio punto. –

4

Direi di andare con OpenTK o se è più comodo utilizzare SharpGL, quindi utilizzarlo in modalità Winforms e incorporarlo in un'applicazione WPF.

Il motivo è che il driver OpenGL sa come lavorare con un handle di finestra, fornito con ogni controllo winforms. In un'applicazione WPF c'è solo un handle di finestra, quello della finestra principale. Potresti provare a usarlo, ma penso che porrà troppi problemi.

Se non vuoi che le immagini vengano renderizzate direttamente sullo schermo e pensi di usare PixelBufferObject o RenderBufferObject, probabilmente starai bene con SharpGL in modalità WPF (esegue il rendering su RenderBufferObject, che posiziona il buffer risultante in un'immagine, probabilmente usando un WritableBitmap o così, oppure puoi fare tu stesso la stessa cosa.