SFML - Tilemap

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Brainfreeze
Beiträge: 21
Registriert: 20.06.2012, 20:14

SFML - Tilemap

Beitrag 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ß
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: SFML - Tilemap

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Brainfreeze
Beiträge: 21
Registriert: 20.06.2012, 20:14

Re: SFML - Tilemap

Beitrag 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ß
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: SFML - Tilemap

Beitrag 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.
Antworten