Domanda

Ho scritto un semplice plotter di dati GDI-based utilizzando C ++ / CLI, ma non è particolarmente veloce (un po 'di profilazione di base indica che è il rendering a schermo che è il problema).

C'è un modo per abilitare l'accelerazione hardware per un UserControl o c'è un'interfaccia NET per Direct3D? ... o ci sono alcune altre opzioni che potrei prendere in considerazione.

Stiamo usando codice gestito per cui la soluzione davvero bisogno di essere CLI compatibile, se possibile.

[Edit] In caso aiuta, sto lacerando strisce (128 punti dati) di rettangoli che sono ogni pixel 2x2 con Graphics::FillRectangle -? Forse c'è un modo migliore di fare che

È stato utile?

Soluzione

Managed DirectX è stato sconsigliato per qualche tempo. Davvero non si vuole usare quella. Invece, si dovrebbe utilizzare SlimDX che è uno strato di interoperabilità fonte aperta per le API DirectX SDK scritte in C ++ / CLI. E 'meglio di Managed DirectX ed è supportato da una comunità di sviluppatori esperti. (Ho intenzione di lavorare sul miglioramento del supporto DirectWrite con loro al più presto.)

Altri suggerimenti

Dalla mia esperienza, non sarà possibile ottenere buone prestazioni abbastanza fuori utilizzando GDI +. Anche per semplice disegno, sarete rapidamente conto che c'è un sacco di spese generali.

Alternatives sarebbe (come lei ha ricordato) essere Direct3D, oppure si potrebbe prendere in considerazione GDI con chiamate di sistema. Questo rende ovviamente la piattaforma di codice dipendente ma può essere abbastanza veloce. Ho avuto buoni risultati utilizzando questo.

Tutto dipende da quanto la complessità siete disposti a trattare con. GDI può essere relativamente facile, una volta a capire le basi, Direct3D è un po 'più complessa. Anche se Direct3D è più a prova di futuro.

E 'vero che GDI + non è molto buona performance, ma io stesso ho scritto un GDI + plotter in un progetto legato al lavoro che è in grado di sputare fuori i grafici con migliaia di punti a ~ 30 fotogrammi pr secondo con risoluzione 1680x1050 (scorrimento grafico).

Ci sono voluti un sacco di messa a punto per raggiungere questo obiettivo:

  • Convertire tutto per un unico percorso prima di disegnare.
  • Se si utilizza back-tampone, utilizzare uno con pixel formato Format32bppPArgb, questo può accelerare blitting 2-4x.
  • Se tracciando un percorso con un lot di linee verticali (segnale ad alta frequenza), le trascinano come linee orizzontali su un buffer posteriore invece, e quindi disegnare l'immagine ruotata sullo schermo. Essere consapevoli del fatto che il disegno di un'immagine ruotata anche avere certo costo.

Non riesco a vedere come il vostro scenario richiede un sacco di ottimizzazione, però, 128 punti di dati non sono niente. Mettendo questi punti in una GraphicsPath potrebbe fare una differenza però, dal momento che significherebbe meno overhead di smistamento.

Quale risoluzione e frame rate stiamo parlando qui a proposito?

Microsoft ha ora anche Direct2D , che è con accelerazione hardware 2D disegno:

  

Direct2D è un accelerazione hardware,   immediato-mode, 2-D grafici API   eccellenti prestazioni e   il rendering di alta qualità per 2-D   geometria, bitmap e testo. Il   API Direct2D è progettato per   interagire bene con GDI, GDI +, e   Direct3D.

Si richiede Windows 7 / Server 2008 R2, ma il supporto è stato di nuovo aggiunto a Vista / Server 2008 attraverso la Piattaforma Aggiornamento :

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