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

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

11

25.06.2012, 15:58

Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

25.06.2012, 17:17

Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.

Immer noch ein schlechter Ansatz, weil du dann immer noch jedes Tile einmal überprüfen musst!
Stell dir mal vor, deine Map ist 10000x1000 Tiles groß, dann müsstest du 10 Millionen Tiles in jedem Frame überprüfen, nur um dann am Ende einen kleinen Bruchteil davon zu zeichnen.

Dabei geht es doch ganz einfach:
Anhand der Kameraposition und der Bildschirmgröße bestimmst du X und Y des Tiles, das die Kamera links oben in der Bildschirmecke sieht.
Dann das gleiche für rechts unten.
Nun hast du den kleinsten und größten sichtbaren X- und Y-Wert, und alle Tiles dazwischen sind sichtbar.
Da empfiehlt es sich natürlich, die Tiles auch in einem 2D-Array anzuordnen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

13

25.06.2012, 17:25

Da empfiehlt es sich natürlich, die Tiles auch in einem 2D-Array anzuordnen.

das macht das ganze einfacher, aber man könnte auch mit einem 1D-Array an die ganzen Tiles kommen, sofern sie geordnet vorhanden sind und die Breite und Höhe der Map bekannt ist

Davids Vorschlag ist der, den auch ich verwenden würde
wenn man keine rechteckigen Tiles hat, dann dürfte es zwar etwas schwieriger werden, an den richtigen Bereich an Tiles zu kommen, aber nicht unmachbar schwer
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

14

25.06.2012, 17:55

Ungefähr sowas?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int Map[map_hoehe][map_breite]=
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
//


Die Map läuft mit 22 FPS und hat eine Spritegröße von 20x20

So besetze ich momentan die einzelnen Punkte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for(unsigned int i = 0; i < map_hoehe; i++)
{
    for(unsigned int j = 0; j < map_breite; j++)
    {

        //Tile mit new erstellen und Werte setzen
        //
        Tile *tile;
        tile = new Tile(0);
        tile ->SetPosition(i*tile_hoehe,j*tile_breite);
        if(Map[i][j] == 0)
        {
          tile ->SetImage(TileImg1);
        }

        if(Map[i][j] == 1)
        {
          tile ->SetImage(TileImg2);
        }
        TileList.push_back(*tile);
    }
}
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

15

25.06.2012, 18:30

Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.

Immer noch ein schlechter Ansatz, weil du dann immer noch jedes Tile einmal überprüfen musst!
Stell dir mal vor, deine Map ist 10000x1000 Tiles groß, dann müsstest du 10 Millionen Tiles in jedem Frame überprüfen, nur um dann am Ende einen kleinen Bruchteil davon zu zeichnen.

Öh nein, nur ein einziges mal, danach liegen die ja statisch im Buffer.

Zitat


Dabei geht es doch ganz einfach:
Anhand der Kameraposition und der Bildschirmgröße bestimmst du X und Y des Tiles, das die Kamera links oben in der Bildschirmecke sieht.
Dann das gleiche für rechts unten.
Nun hast du den kleinsten und größten sichtbaren X- und Y-Wert, und alle Tiles dazwischen sind sichtbar.
Da empfiehlt es sich natürlich, die Tiles auch in einem 2D-Array anzuordnen.

Gut, das ist besser. Aber ein einziges mal alles durchgehen sollte auch nicht der Overkill werden.
Es sei denn man ändert und scrollt die Map sehr oft, dann ist deine Variante natürlich vorzuziehen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

25.06.2012, 19:09

Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.

Immer noch ein schlechter Ansatz, weil du dann immer noch jedes Tile einmal überprüfen musst!
Stell dir mal vor, deine Map ist 10000x1000 Tiles groß, dann müsstest du 10 Millionen Tiles in jedem Frame überprüfen, nur um dann am Ende einen kleinen Bruchteil davon zu zeichnen.

Öh nein, nur ein einziges mal, danach liegen die ja statisch im Buffer.

Aber die Kamera bewegt sich doch (sonst wäre das ja alles sowieso witzlos) - und somit müsstest du es jedes Frame tun.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

17

25.06.2012, 19:19

Wenn sie sich dauernd bewegt, lohnt sich dann überhaupt ein VBO?
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

18

25.06.2012, 19:23

Was wär denn die Alternative? ;)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

19

25.06.2012, 19:34

Was wär denn die Alternative? ;)

Da hab ich wohl nicht weit genug gedacht. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

20

25.06.2012, 22:45

ich hatte mir vor einiger zeit ähnliche gedanken gemacht. auch ich hatte vor, alles einmal auf einen buffer zu rendern und dann eben diesen buffer immer wieder anzeigen zu lassen. allerdings würde das NUR und ausschließlich performance gewinn bedeuten, wenn man entweder, den buffer so groß wählt, das er einen größeren teil der map enthält, als angezeigt wird, oder die map nicht bewegt wird.
noch ein nachteil an den buffern ist, das man keine animationen zulässt, oder eben nur schwerlich. z.b. wasser wäre sowas, wo man eine animation benutzen könnte.

den größten performance zuwachs erhält man durch da clipping, und einen runden draw prozess.

mfg

edit: meine maps laufen derzeit auf 60fps mit 2-5% prozessorauslastung im release mode. größe spielt hierbei keine rolle, können auch 1kk*1kk tiles sein, kein merklicher unterschied. konzentriere dich aufs clipping, das wird wahre wunder bewirken.

Werbeanzeige