Domanda

Sto scrivendo un controllo C# che racchiude DirectX 9 e fornisce un'interfaccia semplificata per eseguire il disegno a livello di pixel 2D..NET richiede di racchiudere questo codice in un blocco di codice non sicuro e di compilarlo con l'opzione Consenti codice non sicuro.

Sto bloccando l'intera superficie che quindi restituisce un puntatore all'area di memoria bloccata.Posso quindi scrivere i dati dei pixel direttamente utilizzando l'aritmetica "semplice" del puntatore.Ho testato le prestazioni di questo e ho riscontrato un sostanziale miglioramento della velocità rispetto ad altri metodi "sicuri" di cui sono a conoscenza.

È questo il modo più veloce per manipolare singoli pixel in un'applicazione C# .NET?Esiste un modo migliore e più sicuro?Se esistesse un approccio altrettanto veloce che non richieda la manipolazione del puntatore, preferirei usarlo.

(So ​​che siamo nel 2008 e dovremmo tutti usare DirectX 3D, OpenGL, ecc., tuttavia questo controllo deve essere utilizzato esclusivamente per il rendering pixel 2D e semplicemente non richiede il rendering 3D.)

È stato utile?

Soluzione

L'uso di puntatori non sicuri è il modo più veloce per eseguire la manipolazione diretta della memoria in C# (decisamente più veloce rispetto all'uso delle funzioni wrapper Marshal).

Solo per curiosità, che tipo di operazioni di disegno 2D stai cercando di eseguire?

Lo chiedo perché bloccare una superficie DirectX per eseguire manipolazioni a livello di pixel annullerà la maggior parte dei vantaggi dell'accelerazione hardware che speri di ottenere dall'utilizzo di DirectX.Inoltre, il dispositivo DirectX non verrà inizializzato se utilizzato su servizi terminal (desktop remoto), quindi il controllo sarà inutilizzabile in quello scenario (questo potrebbe non avere importanza per te).

DirectX sarà una grande vittoria quando si disegnano triangoli di grandi dimensioni e si trasformano immagini (texture mappate su un quad), ma non funzionerà così bene con la manipolazione di singoli pixel.

Restando in ambito .NET, un'alternativa è tenere attorno un oggetto Bitmap che funga da superficie, utilizzando LockBits e accedendo direttamente ai pixel tramite il puntatore non sicuro nell'oggetto BitmapData restituito.

Altri suggerimenti

Sì, probabilmente è il modo più veloce.

Qualche anno fa ho dovuto confrontare due immagini 1024x1024 a livello di pixel;i metodi get-pixel hanno richiesto 2 minuti e la scansione non sicura ha richiesto 0,01 secondi.

Ho anche usato unsafe per accelerare cose di quella natura.I miglioramenti delle prestazioni sono a dir poco drammatici.Il punto qui è che unsafe disattiva un sacco di cose di cui potresti non aver bisogno finché sai cosa stai facendo.

Inoltre, controlla DirectDraw.È il componente grafico 2D di DirectX.È davvero veloce.

Recentemente mi è stato assegnato il compito di creare un semplice controllo dell'istogramma per una delle nostre app thin client (C#).Le immagini che stavo analizzando erano circa 1200x1200 e dovevo fare la stessa strada.Potevo far sì che la cosa si disegnasse da sola una volta senza problemi, ma il controllo doveva essere ridimensionabile.Ho cercato di evitarlo, ma dovevo arrivare alla memoria grezza stessa.

Non sto dicendo che sia impossibile utilizzare le classi .NET standard, ma alla fine non sono riuscito a farlo funzionare.

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