Der richtige Weg, um Bilder zu Monogame / Windows hinzuzufügen

7

Ich fange mit MonoGame an. Im Moment ziele ich nur auf Windows (Desktop - nicht speziell Windows 8).

Ich habe in der Vergangenheit einige XNA-Produkte verwendet (rohes XNA, FlatRedBall, SilverSprite), sodass ich möglicherweise ein Missverständnis darüber habe, wie ich meinem Inhalt Bilder hinzufügen soll.

Wie füge ich meinem Projekt Bilder hinzu?

Derzeit habe ich ein neues Monogame-Projekt erstellt, einen Ordner mit dem Namen "Inhalt" hinzugefügt und dort Bilder hinzugefügt. Die einzige Einschränkung ist, dass ich die Copy to Output DirectoryAktion auf eine von Copydenen einstellen muss .

Es scheint seltsam, weil mein "rohes" XNA-Projekt erst letzte Woche ein ContentProjekt XNA Framework Content Pipelineenthielt ( laut VS2010), das meine Bilder zu XNB zusammenstellte (glaube ich). Es scheint, dass Monogame nicht dieselbe Inhaltspipeline verwendet , aber ich bin mir nicht sicher.

Bearbeiten: Meine Frage bezieht sich nicht auf "Wie kann ich die XNA-Inhaltspipeline mit Monogame arbeiten lassen?". Meine Frage lautet: "Warum sollte ich die XNA-Inhaltspipeline in Monogame verwenden?"

Weil es (mindestens) zwei Lösungen gibt (die ich heute sehe):

  • Fügen Sie die Bilder zum Monogame-Projekt hinzu und legen Sie die Copy to Output Directoryzu kopierenden Optionen fest.
  • Fügen Sie ein XNA Content Pipeline - Projekt und fügen Sie meine Bilder zu diesem statt; Verweise auf mein MOnogame-Projekt.

Welche Lösung soll ich verwenden und warum? Ich habe derzeit eine funktionierende Version mit der ersten Option.

Asche999
quelle

Antworten:

3

Es gibt tatsächlich einen Weg um die Inhaltspipeline herum, wenn Sie sie zumindest für Bildabhängigkeiten nicht verwenden können: Verwenden Sie die TitleContainer-Klasse, um Ihre Abhängigkeiten in ihre Rohform zu laden:

// Load a Texture2D from a file
System.IO.Stream stream = TitleContainer.OpenStream("Content/My Sprite.png");
mySpriteTexture = Texture2D.FromFile(GraphicsDevice, stream);

// Load a SoundEffect from a file 
// (NOTE: This is NOT in the current version of MonoGame)
stream = TitleContainer.OpenStream("Content/My Sound.wav");
mySound = SoundEffect.FromStream(stream);

Diese funktionieren überall dort, wo das Xna Framework verwendet werden kann, die Xna Content Pipeline jedoch nicht verfügbar oder zu unpraktisch ist.


quelle
2

Ich erstelle ein XNA-Projekt in meiner MonoGame-Lösung. Ich habe den Kompilierungsspeicherort dieses "Dummy" -Projekts so festgelegt, dass er auf denselben Speicherort verweist, an den MonoGame kompiliert.

Wenn Sie Ihr Projekt erstellen, konvertiert das XNA Content-Projekt Ihre Bilder in XNB-Dateien am selben Speicherort wie Ihre MonoGame-Binärdateien.

Sie müssen die XNA-Inhaltspipeline verwenden, um Ihre XNB-Dateien abzurufen. Wenn Sie ein MonoGame-Projekt schreiben, führt derzeit kein Weg daran vorbei.

Ich lösche dann die Datei dummy.exe, wenn ich eine Version einreiche.

jgallant
quelle
1
Meine Frage ist wirklich, ob ich die Inhaltspipeline überhaupt verwenden soll oder nicht. Was sind die Kompromisse hier? Ich habe meine Frage entsprechend aktualisiert.
Asche999
1

Ich habe es zum Laufen gebracht, indem ich eine offene XNA-Lösung habe, bei der ich die JPGs oder PNGs hinzufüge, um sie dann neu zu erstellen.

Ich kopiere dies dann in den Inhaltsordner in der MonoGame-Lösung und setze es in den Eigenschaften auf einen Inhaltstyp.

Ich verstehe, dass das Monogame-Team versucht, eine Content-Pipeline zu erstellen, aber ich bin mir nicht sicher, wo sie das tun

RoughPlace
quelle
Meine Frage ist wirklich, ob ich die Inhaltspipeline überhaupt verwenden soll oder nicht. Was sind die Kompromisse hier? Ich habe meine Frage entsprechend aktualisiert.
Asche999
1

Der Grund für die Verwendung der Inhaltspipeline finden Sie in der Microsoft XNA-Dokumentation .

Der Hauptgrund, warum XNA Game Studio eine Content-Pipeline verwendet, besteht darin, dass Ihr Spiel schnell läuft. Ohne die Inhaltspipeline müsste Ihr Spiel mit seinen Kunstelementen im ursprünglichen Dateiformat erstellt werden. Wenn das Spiel seine Grafik laden muss, um sie auf dem Bildschirm zu zeichnen, muss es sein Format bestimmen und die Daten in eine Form konvertieren, die es direkter verwenden kann. Dies müsste zur Laufzeit für jedes Asset durchgeführt werden, sodass der Spieler darauf wartet, Spaß zu haben.

Der Nachteil ist der zusätzliche Aufwand, der erforderlich ist, um ein Inhaltsprojekt einzurichten und den Prozess zum Erstellen Ihrer optimierten XNB-Dateien zu verwalten. Hier ist ein Zitat aus dem Link in Ihrer Frage zur Klarheit.

Das Problem bei der Verwendung von XNA Content Builder-Ausgaben auf anderen Plattformen besteht darin, dass die XNB-Dateien plattformspezifisch sind. MonoGame hat dies mit einem eigenen Multi-Plattform-Builder-Projekt umgangen, mit dem kompilierte Assets für alle Zielplattformen erstellt werden können. Ein Nachteil ist, dass dies von der ursprünglichen XNA-Inhaltsprojektvorlage abhängt, die nur in VS2010 verfügbar ist (Express reicht aus). Fürchte dich nicht, aber es gibt Pläne für eine Open-Source-Version.

Wie Sie bereits festgestellt haben, ist es bei MonoGame nicht erforderlich, XNB-Dateien zu verwenden, da Sie den Rohinhalt direkt zum Projekt hinzufügen können. Für ein kleines Projekt denke ich, dass das in Ordnung ist. Es ist das, was ich bisher mit all meinen Projekten gemacht habe und ich hatte (noch) keine Probleme.

Ein Wort der Vorsicht, die Dinge können sich ein wenig ändern, sobald das MonoGame-Team die Implementierung seiner eigenen Content-Pipeline abgeschlossen hat. Hier ist ein Zitat aus einem Forumsbeitrag, den ich vor einiger Zeit gepostet habe .

Es ist nicht erforderlich, XNB-Dateien zu verwenden. Sie sind einfach das Format, das der ContentManager liest (der ContentManager von MonoGame liest derzeit andere Formate wie JPG, PNG usw., wird jedoch entfernt, wenn eine Content Build-Pipeline in Betrieb genommen wird).

Der Vorteil der Verwendung von XNB besteht darin, dass es in einem Format vorverarbeitet wird, das direkt von der GPU verwendet werden kann (im Fall von GPU-Assets). Das Laden eines PNG erfordert eine Dekomprimierung des PNG, möglicherweise einen Kanalwechsel (insbesondere rot und blau) und das anschließende Kopieren dieser unkomprimierten Daten in eine Texture2D. Wenn die Textur Alpha enthält, müssen Sie das Alpha höchstwahrscheinlich für jedes Pixel selbst vormultiplizieren. Dies geschieht alles zum Ladezeitpunkt. Bei XNB erfolgt die Dekomprimierung, der Kanaltausch und vor allem die Vormultiplikation von Alpha zur Erstellungszeit. Sie können auch weiter optimieren, wie ich es in einigen meiner Spiele getan habe, indem ich eine geditherte 16-Bit-Textur an den XNB ausgegeben habe, um Speicherplatz und Bandbreite anstelle des 32-Bit-Standardformats zu sparen.

Das Laden aus PNG ist in Ordnung, wenn es für Sie funktioniert. Es gibt einige Kompromisse für die Bequemlichkeit, aber sie werden für die meisten Entwickler keine Rolle spielen.

Wenn Sie sich für den Pfad der Inhaltspipeline entscheiden, kann diese Dokumentation hilfreich sein. https://github.com/mono/MonoGame/wiki/MonoGame-Content-Processing

Handwerksspiele
quelle