Ich entwickle ein 2D-Spiel und habe viele Sprites. Ich habe 3D-Animationen und -Modelle verwendet, um sie in 2D zu rendern und ihnen das Aussehen von "Fallout" oder "Diablo" zu verleihen. Es ist auch einfacher als von Hand zu zeichnen, lol.
Ich musste die Framerate bereits auf 15 fps reduzieren, was der niedrigste Wert war, den ich erreichen konnte, ohne sie abgehackt wirken zu lassen. Es war jedoch traurig, wie unglaublich glatt 24 Frames aussahen.
Es gibt zwei Gründe, warum ich das getan habe:
1) Reduzieren Sie den Festplattenspeicher. Je weniger Bilder, desto kleiner wird mein Gesamtspiel.
2) Reduzieren Sie den RAM-Verbrauch. Je weniger Bilder geladen werden müssen, desto wahrscheinlicher vermeide ich Probleme mit der RAM-Beschränkung.
Wenn es jedoch eine Möglichkeit gäbe, die Bilder sowohl im Festplattenspeicher als auch im RAM zu komprimieren, würde ich dies tun. Ich habe es schon einmal getestet und die meisten erhalten keine Qualitätsänderung, wenn sie von RGBA8888 auf RGBA5555 umsteigen, und nur einen kleinen Treffer, wenn ich in meinem TexturePacker-Programm auf RGBA4444 umsteige. Ich mache dies derzeit nicht, da SFML anscheinend dieselbe Speichermenge verwendet, unabhängig davon, um welche Art von PNG-Bild es sich handelt. Ich habe nachgeforscht, wie man es anders lädt, aber nichts zu diesem Thema gefunden.
Ich habe viel darüber gelesen, wie man mit 2D-Videospielen umgeht. Der Konsens ist überwältigend: Packe deine Sprites in eine größere Textur, um eine großartige Leistung zu erzielen! Also packe ich meine winzigen Sprites mit TexturePacker in ein viel größeres Spritesheet.
Ich plane jedoch 10-15 Animationen pro Charakter, 5 Bewegungsrichtungen und 15-40 Bilder pro Animation (wahrscheinlich durchschnittlich 24). Mit 15 Animationen, 5 Richtungen und durchschnittlich 24 Bildern pro Animation; Das sind 1800 Einzelbilder pro Zeichen. Wenn in einem Sprite-Blatt gepackt, sind das stattdessen nur 75 Bilder. (Ein Sprite-Blatt pro Animation, pro Richtung. 15 * 5)
Für den einen großen Boss im Spiel kann ich kein Spritesheet verwenden und muss eine Methode programmieren, um einfach jeweils ein Bild zu laden. Ich weiß noch nicht, ob ich das für die Aufführung tun kann.
Für die Charaktere packe ich sie bereits in ein Spritesheet. Für einen einzelnen Charakter, der herumläuft, scheint dies die meiste Zeit zu funktionieren, obwohl es manchmal zum Stillstand kommt. Ich schreibe das jedoch meinem schlecht konzipierten Code zu, der Texturen austauscht, anstatt alle Texturen für dieses Zeichen vorzuladen.
Wenn ich die Texturen vorlade, ist das für Sprite-Sheets sinnvoll. Ich würde mir nur vorstellen, dass es eine schlechte Idee ist, 1800 winzige Bilder für jeden Charakter vorzuladen.
Ich stelle mir jedoch vor, dass es extrem schnell ist, sie nacheinander in den Speicher zu streamen und wieder aus dem Speicher zu entfernen, sodass ich immer nur ein einziges Bild im Speicher haben muss. Würde das nicht bedeuten, dass ich zu jedem Zeitpunkt nur ein paar KB anstelle von 45 + MB pro Zeichen verbrauchen würde?
Ich stelle mir vor, dies würde meine Leistung beeinträchtigen, da das Streamen unglaublich schnell sein müsste (15 Bilder pro Sekunde in den Speicher und aus dem Speicher) und obwohl die Bilder sehr klein wären, wäre es möglicherweise eine bessere Idee, Zeichenspritesheets zu laden stattdessen in den Speicher. Aber ich muss trotzdem ein Stream-ähnliches Rendering-System für ein einzelnes Bild für meinen größeren Boss-Charakter programmieren.
Ich habe experimentiert, aber es ist kein einfacher Prozess. Vor allem, weil ich an anderen Teilen der Spiel-Engine arbeite, die sich momentan nicht mit Grafik befassen.