Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.12.2014, 09:18

Spritegrafiken: Frameset vs. single Frames

Hi, bei der Suche nach Sprite-Grafiken stoße ich immer wieder auf zwei verschiedene Konzepte: Manche Spiele verwalten mehrere Animationsframes in einer Datei (pro Animationstyp: Idle, Move, Attack etc. je eine Datei, z.B. goblin_idle; ich nenne die Teile mal Framesets) - andere verwenden pro Animationsframe eine eigene Datei (d.h. z.B. goblin_idle_1 bis goblin_idle_5). Daher frage ich mich ob es dafür bestimmte Gründe gibt oder das ganze nur Geschmackssache ist.Viele kleine Dateien heißt viele kleine Texturen auf der Grafikkarte - wenige große Dateien entsprechend wenige große Texturen auf der Grafikkarte. Klar: Die maximale Texturgröße wird von der Hardware vorgegeben (z.B. auf meinem Netbook 2048x2048 px). Sind die Framesets zu groß muss man sie zur Laufzeit splitten - machbar.

Im Grunde habe ich zwei Möglichkeiten:
  • Framesets pro Figur pro Bewegungstyp (idle, move, etc.) auf die Grafikkarte laden. Dann muss ich beim Wechsel des Bewegungstyps eine andere Textur referenzieren; und während der Animation verschiedene Bereiche der Textur zeichnen (je nachdem welcher Frame gerade dran ist).
  • Oder ich lade pro Figur pro Bewegungstyp jeden Frame als einzelne Textur auf die Grafikkarte. Dann muss ich bei jeder Animation immer eine andere Textur referenzieren, kann aber die gesamte Textur zeichnen, d.h. ich muss kein neues Offset berechnen.
Damit ergeben sich aus meiner Sicht folgende Vorteile von Framesets:
  • Ich muss eine Datei reinladen und eine Textur hochladen. In wiefern sich das auf die Performance niederschlägt .. kp :thinking:
  • Resources sind übersichtlicher (wenige Dateien vs. viele Dateien)
Als Vorteile der Single-Frame-per-File-Variante sehe ich:
  • Möglicherweise platzsparender; z.B. können verschiedene Frames verschieden groß sein, also die erste Bewegungsanimation 64px breit, die nächste aber 72px weil z.B. das Schwert gerade rumschwingt und Platz braucht. Diesen Platz müsste ich bei Framesets allen Frames zuschreiben. (Natürlich kann ich die Framesets auch so bauen, dass die Frames individuelle Größen und Offsets haben. Da das ganze aber die Renderlogik etwas unübersichtlich macht, habe ich diese Variante hier mal ausgeklammert.)
Hat jemand Erfahrungen auf diesem Gebiet? Ich frage mich halt..
  1. .. ob viele kleine Grafiken so "gut" sind (möglicherweise ein Relikt aus Zeiten, in denen pixelweise mit der CPU gezeichnet wurde, so dass es keine Graka-Texturen gab? kp)
  2. .. und was (wenn es einen gibt) der "Standard" ist (sowohl aus Entwickler- als auch Grafikersicht).
LG Glocke :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

20.12.2014, 09:30

So viele Bilder wie möglich in einer Textur ist der aktuelle Weg, weil Wechsel zwischen Texturen unangemessen viel Zeit kostet im Vergleich zu anderen Operationen. Nennt sich Textur-Atlas, bzw. Sprite-Atlas. Alles andere ist GPU-Quälerei.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Lares

1x Contest-Sieger

  • Private Nachricht senden

3

20.12.2014, 09:49

Generell ist es schon sinnvoller, wenn du mehrere Frames in eine Datei hast, weil du mit vielen kleinen Texturen die Grafikkarte nicht auslastest (von Speicherplatz her), dafür aber sehr viel mehr Texturen pro Spielframe auf die Grafikkarte transportierst.
Stell dir das in etwa so vor wie ein Lager, dass nie komplett voll ist, in dem aber jeden Tag mehrmals die Kisten raus und reingeschoben werden.

Die wesentlich wichtigere Frage ist hier meiner Meinung nach eher, wie du die einzelnen Frames der Animationen unterschiedlicher Charaktere etc. sinnvoll verteilst.
Bei einen Spiel mit vielen Gegnern des selben Typs, ergibt es zum Beispiel Sinn möglichst viele Animationen in einer Datei unterzubringen, da sich vermutlich jeder Gegner in einen anderen Zustand befindet (selbst wenn sie die gleiche Animation verwenden, kann ja einer bei Frame 1 und der andere bei Frame 3 sein).

Wie sieht es jedoch mit den Frames der Spielercharakters aus? Je nach Spiel kann es hier durchaus sein, dass du für diese eine Figur eine eigene Datei für alle Animationen hast. Da diese aber eh nur einmal gezeichnet wird, wäre hier mMn Einzeltexturen sinnvoller, da du die anderen Frames eh nicht auf der Grafikkarte brauchst. Noch besser wäre es natürlich, wenn du sämtliche Charaktere mitsamt Animation (oder sogar alles was gezeichnet werden muss) in einer Datei unterkriegen könntest, aber da könnte die Datei dann natürlich zu groß sein, weswegen die Grafikkarte diese nicht mehr ohne weiteres verarbeiten kann.
Überleg dir vorher also genau welche Frames häufig (oder/und zusammen) gebraucht werden, wenn du in Richtung Renderoptimierung entwicklen möchtest.

Btw: Nichts hindert dich daran für Texturen mit vielen Animationsframes zu entwickeln und hinterher doch Einzelframes zu verwenden. Du wirst vllt. 1-2 Tage an der Implementierung hängen bist aber flexibel genug um anschließend selbst zu prüfen, welcher Lösungsansatz geeignet ist.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

4

20.12.2014, 20:24

Wie die Texturen vorliegen ist ja erstmal ziemlich egal, entscheidend ist, wie du sie an die Grafikkarte sendest. Der verbreitete Ansatz ist da möglichst viel in einer 2D Textur zu haben, der moderne Ansatz wäre eine 2D Array Textur. Das ist dann wie eine einzelne 3D Textur, nur ohne interpolation zwischen den Layern. Das sollte mindestens genauso schnell sein wie ein Textur Atlas, nur ohne die Probleme die man da hat (was bei Spriteanimationen aber normalerweise nicht passiert).

BitShift

Frischling

Beiträge: 39

Wohnort: Leverkusen

Beruf: Informatiker Anwendungsentwicklung

  • Private Nachricht senden

5

21.12.2014, 10:55

Vielleicht auch interessant: Wenn du einzelne Texturen verwaltest, bist du vielleicht gezwungen, bestimmte Größen zu benutzen. Das ist unter Umständen aufwendiger vom Contenthandling her, als z.B. Ein Tool wie den Texturepacker zu verwenden. Da muss nur der Rahmen stimmen. Es macht auch Sinn, beim Benutzen von Atlanten nicht alles von Hand zu machen, imo.
java.lang.SignatureMakesNoSenseException: de.signatureHandler.java
caused by: User is too dumb to create a correct signature.

6

22.12.2014, 09:29

Vielleicht auch interessant: Wenn du einzelne Texturen verwaltest, bist du vielleicht gezwungen, bestimmte Größen zu benutzen. Das ist unter Umständen aufwendiger vom Contenthandling her, als z.B. Ein Tool wie den Texturepacker zu verwenden. Da muss nur der Rahmen stimmen. Es macht auch Sinn, beim Benutzen von Atlanten nicht alles von Hand zu machen, imo.

Lol, ich habe mir vor Kurzem so einen AtlasPacker selbst mit SFML gebaut :D Thread im SFML-Forum (en)

Werbeanzeige