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

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

1

24.06.2012, 00:46

Allgemeine Fragen zu Tilemaps

Hey Leute,

ich hätte da ein paar fragen bezüglich Tilemaps.
Undzwar ist es normal das eine tilemap mit 2500 Sprites mit den Maßen 50*50 laggt?
Framerate liegt bei ~4 und selbst bei nur 100 Sprites mit 200*200 liegt dir framrate bei 33.
Ist das normal das Tilemaps so intensiv an der Hardware nagen oder mach ich da was falsch?

Die Tiles sind in einer Liste gespeichert und werden nur gezeichnet ansonsten wiederholt sich nichts.

MfG Marcel
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.06.2012, 01:19

Wie genau renderst du deine Tilemap?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

24.06.2012, 01:20

Vllt. hier mal einen Blick reinwerfen: OpenGL Tilemap perfomance
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

4

24.06.2012, 13:55

So render ich die Map:

C-/C++-Quelltext

1
2
3
4
    for(TileIt = TileList.begin();TileIt != TileList.end();++TileIt)
     {
         TileIt->Draw(window);
     }


und die Draw Funktion sieht so aus :

C-/C++-Quelltext

1
2
3
4
5
6
//Tile zeichnen
//
void Tile::Draw(sf::RenderWindow* window)
{
    window->Draw(Sprite);
}


anonsten das besetzen etc passiert nur 1x im Konstruktor von der Game-Klasse:

C-/C++-Quelltext

1
2
    world = new World;
    world ->GenerateMap();
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

24.06.2012, 14:06

Weswegen jedes Tile immer wieder zeichnen wenn die Karte doch meistens statisch ist und sich nur beim scrollen ändert?
Alles in den VBO packen und updaten wenn man scrollt.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.06.2012, 14:08

Ah ok, du verwendest also SFML... ;)

Ich würde dir empfehlen, auf SFML 2.0 umzusteigen, damit geht's evtl. schon schneller. Zumindest bietet das afaik die Möglichkeiten, um es schneller hinzubekommen...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

24.06.2012, 16:04

Auf jeden Fall solltest du nur die Tiles zeichnen, die von der Kamera auch gesehen werden können.
Und nicht für jedes Tile einen eigenen Draw-Aufruf ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

24.06.2012, 18:08



C-/C++-Quelltext

1
2
3
4
    for(TileIt = TileList.begin();TileIt != TileList.end();++TileIt)
     {
         TileIt->Draw(window);
     }


C-/C++-Quelltext

1
2
3
4
5
6
//Tile zeichnen
//
void Tile::Draw(sf::RenderWindow* window)
{
    window->Draw(Sprite);
}


Was spricht gegen:

C-/C++-Quelltext

1
2
3
4
for(TileIt = TileList.begin();TileIt != TileList.end();++TileIt)
{
  window->Draw(*TileIt);
}


Außerdem solltest du die Tiles auf jeden Fall batchen!
@D13_Dreinig

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

9

25.06.2012, 14:50

ok,
das jedes Tile eine draw Methode hat ist wirklich schwachsinn.
Hab soweit geändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//Zeichnen Funktion
//
void World::Draw(sf::RenderWindow* window)
{
    //Liste durchlaufen und Tiles der Map zeichnen
    //
    for(TileIt = TileList.begin();TileIt != TileList.end();++TileIt)
     {
         window->Draw(TileIt->Sprite);
     }
}


Was mich jetzt intressiert ist, was Architekt mit VBO meint und wie man es den anstellt das nur das
gezeichnet wird was zu sehen ist?
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

25.06.2012, 15:01

Was mich jetzt intressiert ist, was Architekt mit VBO meint und wie man es den anstellt das nur das
gezeichnet wird was zu sehen ist?


VBO: Google mal nach Vertex Buffer Objects, da findet sich ne Menge Information.

Ansonsten musst du die Tiles auf Sichtbarkeit prüfen. Je nachdem wie deine Tiles auf dem Bildschirm angeordnet sind kann das evtl ganz simpel gelöst werden. Die bruteforce Variante wäre einfach jedes Tile zu Testen, das ist allerdings nicht unbedingt der optimale Weg. Ansonsten baust du deinen Vertexpuffer aus den sichtbaren Tiles auf und renderst dann alle Tiles in einem Rutsch.
@D13_Dreinig

Werbeanzeige