Seite 1 von 1

SFML - Tilemap

Verfasst: 09.05.2014, 16:42
von Brainfreeze
Hi,

ich beschäfige mich seit Kurzem näher mit SFML.

Ich möchte eine Tilemap programmieren, hab dazu aber eine Frage zur Herangehensweise.

Kann ich die Map komplett aus sf::Sprite's aufbauen und nacheinander rendern, oder ist das bei einer Tilemap mit mehreren tausend Sprites zu langsam?
Alternativ kann man ja auchnoch ein VertexArray benutzen, allerdings weis ich nicht wie es sich da mit animierten Sprites verhält.
Ausserdem hab ich gelesen, dass man immer nur 1 Texture pro VertexArray benutzen kann.

Kann mir da jemand weiterhelfen?


Gruß

Re: SFML - Tilemap

Verfasst: 09.05.2014, 18:31
von Schrompf
Einzelne Sprites für jedes Tile aufzumachen erscheint mir auch sehr aufwändig. Ich würde zu einem VertexArray raten. Allerdings stimmt es auch, dass man damit (ohne Eigenarbeit) nur aus einer Textur lesen kann. Normalerweise ist das aber kein Problem dank eines Texturatlas. Google mal danach. Das ist eine Methode, viele kleine Grafiken auf einer Textur zu vereinen, so dass man die Einzelgrafiken nur noch per Texturkoordinaten adressieren muss, anstatt jedesmal die Textur zu wechseln. Gerade für eine TileMap, bei der alle Einzelgrafiken die selbe Größe haben, bietet sich das an.

Dann kannst Du entweder pro eines Kartenbereichs gewisser Größe (z.b. 16x16 Tiles) ein VertexArray statisch aufbauen. Dann musst Du es halt neubauen, sobald sich was verändert. Oder Du befüllst das VertexArray dynamisch bei jedem Rendern mit nur den Tiles, die Du rendern willst. Letzteres mache ich bei Splatter.

Re: SFML - Tilemap

Verfasst: 10.05.2014, 15:11
von Brainfreeze
Hi,
Allerdings stimmt es auch, dass man damit (ohne Eigenarbeit) nur aus einer Textur lesen kann.
Das mit dem Texture-Atlas ist mir schon bekannt, danke für den Hinweis ;)

Dann musst Du es halt neubauen, sobald sich was verändert.
Heist das, wenn ich animierte Tiles habe, muss ich bei jedem Rendern das entsprechende VertexArray neu aufbauen?

Als ich ein bisschen mit OpenGl rumexperimentiert hatte (ohne SFML), hatte ich schonmal versucht, bei jeder Frame die VertexArrays neu zu erstellen. Das Resultat waren 30FPS bei knapp 1000 Tiles ;)
Gibts da nicht ne optimierte Möglichkeit?


Noch eine andere Frage zu SFML:
Lohnt es sich, SFML auch für 3D Sachen zu nutzen? Weil so wie ich gelesen habe, hat SFML ja auch ne Menge andere nützliche Sachen, wie Input, Audio, Netzwerk etc.


Gruß

Re: SFML - Tilemap

Verfasst: 10.05.2014, 16:48
von Spiele Programmierer
VertexArrays neu zu erstellen. Das Resultat waren 30FPS bei knapp 1000 Tiles
Gibts da nicht ne optimierte Möglichkeit?
Das ist die optimierte Möglichkeit! Wenn das bei dir dermaßen langsam ist, dann hast du anscheinend etwas grundlegendes falsch gemacht. In meinen eigenen Versuchen hatte ich keine Probleme auch mit dem per Frame Update von über einer Million Vertices bei 60FPS. Einzelne Tiles wären hingegen sehr ineffizient. Ich würde befürchten, das SFML dabei jedes mal einige Statechanges und einen Drawcall generiert mit entsprechend. Da würde tatsächlich schon bei ein paar Tausend die obere Grenze sein. Die CPU auf 100%(ST) und die GPU ist so gut wie gar nicht ausgelastet.

Die prinzipiell etwas optimiere Alternative wäre es natürlich, nicht jedes mal alles im Bildschirmbereich neu auf die Graka zu laden, sondern, besonders wenn die Karte statisch ist, alles in rechteckige Chunks aufzuteilen (zb. 256²) und bei möglichen Änderungen nur den betroffenen Chunk neu an die GPU zu schicken.