Ho guardato in giro un sacco e gli unici metodi che ho trovato per la creazione di un Texture2D da una bitmap sono:Esiste un'alternativa veloce alla creazione di Texture2D da un oggetto Bitmap in XNA?
using (MemoryStream s = new MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}
e
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Dove rgbValues è un array di byte che contiene le bitmap di dati pixel nel formato ARGB a 32 bit.
La mia domanda è: ci sono approcci più veloci che posso provare?
Sto scrivendo un editor di mappe che deve essere letto in immagini in formato personalizzato (tessere mappa) e convertirle in trame Texture2D da visualizzare. La versione precedente dell'editor, che era un'implementazione C++, convertiva le immagini prima in bitmap e poi in trame da disegnare usando DirectX. Ho tentato lo stesso approccio qui, tuttavia entrambi gli approcci di cui sopra sono significativamente troppo lenti. Per caricare in memoria tutte le trame richieste per una mappa impiega per il primo approccio ~ 250 secondi e per il secondo approccio ~ 110 secondi su un computer con specifiche ragionevoli (per confronto, il codice C++ impiega circa 5 secondi). Se c'è un metodo per modificare i dati di una texture direttamente (come ad esempio con il metodo LockBits della classe Bitmap), allora sarei in grado di convertire le immagini con formato personalizzato direttamente in un Texture2D e, si spera di risparmiare tempo di elaborazione.
Qualsiasi aiuto sarebbe molto apprezzato.
Grazie
Non dovrebbe essere "dal chiamante" anziché "callee"? Dagli scopi dell'utente di questo codice, è questa funzione che è il chiamato. – drxzcl
Grazie per la risposta, tuttavia nella mia domanda iniziale intendevo che avevo provato questo approccio - utilizzando SetData(). Ho eseguito ulteriori analisi e per creare Bitmap utilizzando LockBits sono stati necessari 2,7 secondi. Quando ho aggiunto a quel codice, per ogni bitmap generata: Texture2D tx = new Texture2D (dispositivo, bmp.Width, bmp.Height, 0, TextureUsage.None, SurfaceFormat.Color); Ha aumentato il tempo richiesto per 74 secondi !! Solo per creare una trama vuota per ogni bitmap, e nemmeno riempirla. Questo tipo di tempo di caricamento non è accettabile per un gioco 2D. Non pensavo che XNA sarebbe stata così lenta. :/ –
@Ranieri, grazie - risolto! – bufferz