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

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

13.05.2014, 12:17

Tilemap mit SFML2.1

Hi,

ich überlege, wie ich mit SFML2.1 am schnellsten (+FPS) eine Tilemap rendern kann.

Ich nehme an, für jede Tile ein sf::sprite zu benutzen ist wohl nicht Sinnvoll und zu langsam.
Deshalb sind VertexArrays wohl eher angebracht.

Würde es funktionieren, jede Frame ein VertexArray Tile-für-Tile zu befüllen, bis sich zB die Texture ändert, dann das VertexArray rendern, leeren, und dann wieder von vorne zu befüllen?
Als ich vor vielen Jahren mit DirectX9 gearbeitet habe, hatte ich es so gemacht und hatte auch eine annehmbare Geschwindigkeit.
Als ich jedoch vor einiger Zeit das Gleiche mit OpenGL gemacht hab, war es sehr langsam. Wie schaut es bei SFML aus?

Die zweite Möglichkeit wäre, die Map in Einzelteile zu unterteilen (zB 16x16 Tiles) und für jeden Teil ein eigenes VertexArray zu erstellen.
Allerdings kann dann jeder Teil nur einen TextureAtlas benutzen, und animierte Tiles sind auch ein Problem.

Kann mir da jemand weiterhelfen?

Gruß

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

13.05.2014, 12:49

Mach's mit einzelnen Sprites, bis es sich definitiv als zu langsam erweist und refactore dann. In Rickety Racquet machen wir aktuell alles per Sprites und das ist kein Problem. Zumindest nicht im Release-Modus. Im Debug hängt die Performance da aber auch an anderen Stellen ;)
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]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

13.05.2014, 13:58

Wenn es bei dir so langsam war, dann hast du definitiv etwas falsch gemacht.
Für animierte Tiles kannst du einfach regelmäßig den Buffer updaten(Das was du auch mit einzellnen Sprites im Prinzip machen kannst, bloß viel uneffizenter) oder eine erweiterte Möglichkeit wäre auch ein Shader.

Ob einzellne Sprites schnell genug sind, ist eine Frage der Anzahl. Ein paar hundert gleichzeitig Sichtbare wären kein Problem. Ein einige Tausend sollten möglich sein, ist aber uneffizienter und leistungsraubender als es sein müsste und über diese Zahlen hinaus, kann es dann auch schon zu den ersten direkten Problemen kommen. Wenn man zb. weiter heraus zoomen können soll, wodurch sehr viele Tiles sichtbar würden, wird kaum ein Weg um eine anständige Lösung über "VertexArrays", wie das scheinbar in SFML heißt, führen.

Wenn du auch OpenGL nativ nutzt, wären Texture Arrays eine einfacher Alternative zu den Atlanten.
Direkt in SFML wird dir das vermutlich aber nicht zur Verfügung stehen.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

13.05.2014, 14:40

Wenn ich schon "füllen leeren wieder befüllen..." höre zieht sich bei mir eine Augenbraue hoch.

Du kannst die Tilemap sicherlich per VA darstellen, ist aus Performancegründen auch sinnvoll (allerdings nicht relevant), aber warum sollte man die Daten wären des Spiel ändern?
Ich würde pro Tile einfach 4 Vertices in den Buffer schreiben und dabei "ganze" floats nehmen. Also die obere rechte Ecke von Tile 1 hätte die Koordinaten (1.0f|1.0f), die von dem weiter rechts (2.0f|1.0f) usw.
Dadurch skalierst du die Tilemap nachher einfach mit einem Faktor der der größe eines Tiles entspricht (z.B. 32, 64, ...) und tada! Du hast deine Tilemap.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

5

13.05.2014, 14:42

Hi,

Zitat

aber warum sollte man die Daten wären des Spiel ändern?

Animierte Tiles?! Da ändern sich aller paar Frames die Texture-Koordinaten...


Gruß

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

13.05.2014, 14:43

Uniform Variablen?
Mehrere Buffer?
Indiziert updaten?

Komplett neu befüllen (so hab ichs verstanden) wäre wahrscheinlich schlimmer als 10k Sprites zu rendern...

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

7

13.05.2014, 14:47

Hi,

Zitat

Uniform Variablen?

Damit muss ich mich erstmal befassen, weis zwar im Prinzip was das ist, aber kenn mich noch nicht so gut damit aus.

Zitat

Mehrere Buffer?

Das würde eigentlich nur dann Sinn machen, wenn alle animierten Tiles die gleiche Frame-Dauer haben, oder?

Zitat

Indiziert updaten?

Damit meinst du, nur die Teile im VertexArray zu updaten, die sich auch ändern?
Das klinkt erstmal nach ner guten Idee, muss ich mal gucken wir das bei SFML geht ;)


Gruß

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

13.05.2014, 15:17

BlueCobolds Vorschlag ist da schon sehr sinnvoll wie ich finde. Du ersparst dir eine Menge Arbeit und bis es wirklich anfängt zu ruckeln musst du schon einiges an Content haben. Bei Sprites kannst du die Texturen ganz einfach austauschen. Wichtig ist aber auch der Hinweis den er dir gegeben hat. Wenn es langsam wird, teste im Release Modus. SFML ist im Debug Modus wirklich viel viel langsamer als im Release Modus. Nicht nur deine IDE umstellen, sondern vor allem die Release DLLs verwenden. Damit wirst du vermutlich gut fahren und kannst dir die Vertex Arrays sparen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

13.05.2014, 15:32

Man kann theoretisch ja auch die Release-DLLs für den Debug-Build mit VisualStudio verwenden. Ich wüsste zumindest persönlich nicht, wann mir die Debug-Version der SFML mehr Nutzen als schlechte Performance geliefert hat.
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]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

13.05.2014, 17:18

Zitat

Komplett neu befüllen (so hab ichs verstanden) wäre wahrscheinlich schlimmer als 10k Sprites zu rendern...

Ich, bei meinen persönlichen Experimenten in letzter Zeit, hatte zu meiner eigenen Überraschung in OpenGL(GTX760) keine Probleme mit dem Upload von über 1 000 000 Vertices pro Frame bei 60 FPS in ein VBO.

Man könnte natürlich die Tiles auch nach Updaterate sortiert in Buffer halten oder wie ich vorgeschlagen hatte, spezielle Shader verwenden.
Aber im Gegensatz der Verwendung eines einfachen VBOs (bzw SFML "VertexArray") ein deutlicher Mehraufwand in der Verwaltung und die gewonnene Effektivität auch nicht ganz so gewiss.

Werbeanzeige