2016-04-18 15 views
1

Ich habe in letzter Zeit ein Problem mit meinem Spieleprojekt aufgetreten. Wenn ich beim Start mehr als eine bestimmte Anzahl von Texturen (etwa 1000) lade, erhalte ich einen Speicherfehler (weil ich 32-Bit in XNA verwenden muss). Ich bin Autodidakt und habe daher nur Grundkenntnisse über die "richtige" Art, ein Spiel zu programmieren. Das Projekt selbst wird sehr groß und obwohl ich versuche, Bilder zusammen zu komprimieren, muss ich mehr als 1000 Texturen im ganzen Projekt verwenden.So laden Sie Texturen nach dem Start in XNA mit vb.net

Meine Frage ist dann: Wie kann ich Texturen zu anderen Zeitpunkten als beim Start in XNA laden, mit vb.net? (Ich benutze überhaupt keine Klassen, von denen ich weiß, also hoffe ich, wenn möglich davon fern zu bleiben)

Vielen Dank für jede Rückmeldung! /Christian

+0

Chancen zu helfen sind, dass Sie nicht wirklich alle 1000 Texturen zur gleichen Zeit benötigen. Also entlade sie, wann immer du sie nicht brauchst.Aber beginnen Sie am besten damit zusammenhängende Texturen zu einem einzigen Bild zusammenzufügen (auch als Spritesheet bekannt) – Falgantil

+0

Vielen Dank für Ihre Antwort. Ja, du hast Recht, und genau deshalb habe ich meine Frage gestellt :) Was ist: Wie lade ich die Texturen zu anderen Zeitpunkten als beim Start? (Und wie entlade ich sie, wenn ich das tun muss?) –

+0

Sie können Texturen jederzeit laden, stellen Sie nur sicher, dass Sie sie nur einmal laden. und wenn Sie sie nicht brauchen, entsorgen Sie sie einfach. –

Antwort

1

So scheint die Antwort viel einfacher, als ich erwartet hatte, wenn ich es richtig im Moment mache (?).

Ich Lade einfach den Inhalt für alle "Welten" am Anfang des Spiels (in den Protected Overrides Sub LoadContent()) und dann Dispose() und Load.Content() je nachdem, was World später geladen wird (in jedem Sub ich wählen?):

TextureName = Content.Load(Of Texture2D)("") 
TextureName.Dispose() 

Wenn es kein Problem ist ich bin noch nicht bekannt ist, scheint dies den Trick zu tun und mich nicht mit dem Speicherfehler im Start verlassen.

Danke Davor Mlinaric und Monset für mich hoch entlang

1

Ich kann nicht kommentieren, also werde ich nur meine Idee hier setzen. Deklarationszeit: Ich bin auch Autodidakt, also ist der Algorithmus, den ich benutze, nicht der Standard oder so etwas. Ich hoffe es hilft!

Ich verwende eine einzige Klasse namens GContent Hexe ist "instanziert" (mehr wie geladen) die erste Sache, wenn das Spiel beginnt. Diese Klasse ist statisch und enthält Listen für alle Texturen, Sounds und Spritefonts im Spiel. Also, überall in meinem Code kann ich setzen GContent.Texture("texture_folder\\texture_name"); (ähnlich für Sound und Spritefont). Jetzt, bevor diese Funktion Texture2D lädt, überprüft sie ihre Liste von Texturen und versucht, eine Textur mit dem Namen zurückzugeben, nach dem im Parameter gefragt wird. Wenn es die richtige Textur findet, wird die Textur aus der Liste zurückgegeben. Wenn nicht, verwendet es Content.Load(textureFullPath); (mit vollem Pfad meine ich nicht "C: \ Users \ ...."), um die Textur zu laden, geben Sie ihr einen Namen (Texture2D.Name) gleich dem Parameter textureFullPath, fügt diese Textur hinzu Liste und dann gibt die neue Textur zurück.

Also, je mehr du mein Spiel spielst, desto mehr Texturen werden geladen, wenn ich nicht alle Assets zu Beginn des Spiels geladen habe. Nun, ich denke, Sie einfach eine Reihe von string s haben können, die alle Texturen darstellen, die von einer einzigen Ebene verwendet werden, oder eine Karte, oder im Hauptmenü ... Auf diese Weise könnten Sie easaly Funktion erstellen, die List< string > nehmen und versuchen, lade oder entlade alle Texturen einer Karte/Ebene/Menü ...
Also, meine Antwort ist so ziemlich: habe eine statische Klasse mit Listen von Assets und Laden/Entladen von Assets von wo auch immer im Spiel Sie wollen!

Auch, wenn meine Antwort Ihnen geholfen, bitte überprüfen Sie es als Antwort :)

+0

Oh .. Ich kann einfach Content.Load ("...") oder Content.Unload ("...") irgendwo im Update-Sub verwenden? –