Ich habe viel herum geschaut und die einzigen Methoden, die ich für die Schaffung eines Texture2D aus einer Bitmap gefunden haben, sind:Gibt es eine schnelle Alternative zum Erstellen einer Texture2D aus einem Bitmap-Objekt 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);
}
und
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Wo rgbValues ein Byte-Array die Bitmap enthält, Pixeldaten im 32-Bit-ARGB-Format.
Meine Frage ist, gibt es schnellere Ansätze, die ich ausprobieren kann?
Ich schreibe einen Karteneditor, der Bilder im benutzerdefinierten Format (Kartenkacheln) einlesen und in Texture2D-Texturen konvertieren muss, um sie anzuzeigen. Die vorherige Version des Editors, die eine C++ - Implementierung war, wandelte die Bilder zuerst in Bitmaps und dann in Texturen um, die mit DirectX gezeichnet wurden. Ich habe den gleichen Ansatz hier versucht, jedoch sind beide der oben genannten Ansätze deutlich zu langsam. Um alle für eine Karte erforderlichen Texturen in den Speicher zu laden, werden für den ersten Ansatz etwa 250 Sekunden und für den zweiten Ansatz etwa 110 Sekunden auf einem Computer mit vernünftiger Spezifikation benötigt (zum Vergleich benötigte C++ - Code etwa 5 Sekunden). Wenn es eine Methode gibt, die Daten einer Textur direkt zu bearbeiten (zB mit der LockBits-Methode der Bitmap-Klasse), wäre ich in der Lage, die Bilder im benutzerdefinierten Format direkt in eine Texture2D zu konvertieren und hoffentlich Verarbeitungszeit zu sparen.
Jede Hilfe würde sehr geschätzt werden.
Dank
Sollte das nicht "vom Anrufer" statt "Angerufener" sein? Aus den Zwecken des Benutzers dieses Codes ist diese Funktion der Angerufene. – drxzcl
Danke für deine Antwort, aber ich meinte in meiner ursprünglichen Frage, dass ich diesen Ansatz versucht habe - mit SetData(). Ich habe eine weitere Analyse durchgeführt, und um die Bitmaps mit LockBits zu erstellen, brauchte ich 2,7 Sekunden. Wenn ich diesen Code für jede erzeugte Bitmap hinzugefügt habe: Texture2D tx = new Texture2D (Gerät, bmp.Width, bmp.Height, 0, TextureUsage.None, SurfaceFormat.Color); Es dauerte die Zeit bis 74 Sekunden !! Nur um eine leere Textur für jede Bitmap zu erstellen und nicht einmal zu füllen. Diese Ladezeit ist für ein 2D-Spiel nicht akzeptabel. Ich hätte nicht gedacht, dass XNA so langsam wäre. :/ –
@Ranieri, danke - behoben! – bufferz