Frage bezüglich Vorgehensweise bei Darstellung einer 2-D Tilemap



  • Hallo, folgendes:

    ich habe eine Karte welche aus einzelnen Tiles besteht bzw. bestehen soll(derzeit einfach aus gefärbten Rechtecken). Nun habe ich mir ein ansprechendes Tileset runtergeladen und möchte die einzelnen Tiles auf die Parzellen zeichnen.
    Hierzu gäbe es ja auf den ersten Blick zwei Möglichkeiten:

    a) Tileset einmal komplett Laden und dann den Parzellen schlicht Nummern geben, welche dann über einen Algorithmus in Tiles des Tilesets übersetzt werden und schließlich auf die jeweilige Parzelle gezeichnet werden.
    Vorteil: Weniger Speicherverbrauch
    Nachteil: (deutlich) höhere Prozesserauslastung

    b) Für jede Parzelle das passende Tile aus dem Tileset kopieren und in der Parzelle speichern(sprich die Parzellen haben eigenen Speicher für die Ausschnitte), dann alle Parzellen laden und zeichnen.
    Vorteil: Geringer CPU-Last
    Nachteil: Höherer Ramverbrauch

    Nun tendiere ich stark zu b) da RAM eh praktisch unbegrenzt(auf nicht all zu alten Systemen) vorhanden ist, aber vielleicht hat ja jemand Erfahrung mit sowas und kann mir zu einer der Varianten raten, möglicherweise versteckt sich ja mehr Aufwand denke.



  • Also Speicher magst du genug haben, aber du hast nicht unbegrenzt Speicherbandbreite.

    Davon abgesehen verstehe ich nicht ganz was du meinst. Aber egal.

    Die "klassische" Variante ist: du machst für die "Parzellen" ein zweidimensionales Array aus z.B. 16 Bit Integern.
    Jedes Element des Arrays steht für eine Parzelle, und reinschreiben tust du die Nummer der Tile-Grafik die reingemalt werden soll.

    Beim Zeichnen gehst du dann dieses 2D Array durch (bzw. natürlich nur die sichbaren Bereiche des Arrays), und malst die über die Nummer identifizierte Grafik an die entsprechende Stelle am Bildschirm.

    Die einzelnen Tile-Grafiken fasst du dabei zu einer bzw. mehreren grossen Texturen zusammen. Also z.B. 256 32x32 Pixel Tiles zu einer 512x512 Textur.

    Bei grösseren Tiles brauchst du nichts weiter zu optimieren. Ausser vielleicht dass du das Array 1x pro Textur durchgehst (falls du mehr als eine Textur brauchst), um Textur-Wechsel zu sparen. Lieber 10x über das Array drüberiterieren, und dafür nur 10 Texturwechsel insgesamt, als pro Draw-Call einen Texturwechsel. (Obwohl auch die Texturwechsel nicht mehr so teuer sind wie sie es mal waren.)

    Wenn du sehr kleine Tiles hast, so dass du auf z.B. >= 1000 sichtbaren Parzellen pro Frame kommst, kannst du mehrere Array-Elemente zu grösseren Blöcken zusammenfassen. Pro Block generierst du dann einen Vertex-Buffer, der pro Element des Blocks ein Quad (=2 Dreiecke) enthält, mit den passenden Texturkoordinaten für die jeweilige Tile-Grafik. Bzw. wenn du mehr als eine Textur brauchst, dann pro Block und Textur einen Vertex-Buffer. Dann kannst du einen ganzen Block aus z.B. 16x16 Parzellen mit einem einzigen Draw-Call zeichnen (bzw. einem Draw-Call pro Textur).

    Ansonsten schreib mal ein paar konkrete Eckdaten.
    Also ...
    * Welche Auflösung?
    * Wie gross sind deine Tiles (Pixel)?
    * Wie viele Parzellen sind im Schnitt "leer" (=kein Tile drauf=100% durchsichtig)?
    * Wie viele solche Tile-Maps (Layer) hast du übereinander liegen?
    * Wie gross sind deine Karten (Bitte Einheit dazuschreiben, also Pixel/Tiles/Bildschirmbreiten/...)?
    * Willst du das Tile-Set in verschiedenen Zoom-Stufen darstellen können, oder nur mit 1:1 Pixel-Mapping?
    bzw. was dir sonst noch an relevanten Informationen einfällt.

    Achja, vielleicht noch: kannst/willst du überhaupt eine 3D-API verwenden, oder willst/musst du mit einer 2D API/Sprite-Engine arbeiten?



  • Und im Übrigen hat das natürlich genau nix mit Standard C++ zu tun, sondern gehört ganz klar nach Spiele-/Grafikprogrammierung.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten