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

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

1

14.08.2013, 10:25

[SFML] Nebel und niedrige Framerate

Hallo alle miteinander,

ich versuche das Spieleprogrammieren zu erlernen, doch immer wieder laufe ich mit dem Kopf gegen die Wand :/
Da mein erstes Spiel auf SDL eine zu niedrige Framerate hatte, bin ich auf SFML umgestiegen, da ja OpenGL genutzt wird und die Grafikbeschleunigung aktiviert wird.
Kurz zu meinem Spiel: Das Spiel ist ein Strategiespiel im Weltall. Jeder Spieler hat ein Mutterschiff, welches sowohl das Zerstörungsziel der Gegenspieler ist, als auch das Schiff, mit dem man weitere Schiffe (bis jetzt Schlachtschiffe und Jäger) bauen kann. Damit man nicht direkt weiß, wo sich der Gegner befindet, wollte ich einen Nebel einbauen, der dann bei den Positionen der Schiffe aufgedeckt wird.
Das Problem ist dabei, dass ich das Spiel noch nicht einmal ansatzweise Fertig habe, aber wegen dem Nebel gerade mal 18 Bilder pro Sekunde habe. Selbst ohne Nebel komme ich nicht einmal über 60 Bilder pro Sekunde.

Könnte vielleicht jemand einmal über meinen Code schauen und nachsehen, welche Fehler ich gemacht habe, oder was ich besser machen könnte?
Ich bedanke mich im Voraus :D


Matthias


Im Ordner finden sich:
- Die Ressourcen (PNG und TTF)
- Singleton.h (Singletonklasse aus dem Buch "C++ für Spieleprogrammierer")
- main.cpp (Start des Spiels)
- RM (RessourceManager zur Verwaltung meiner Ressourcen)
- Game.h Game.cpp (Das Spiel selbst)
- Game_Event.cpp (Die Eventfunktion von Game.h habe ich in eine seperate Datei gepackt)
- GameLevel.h GameLevel.cpp (Die Klasse verwaltet alle Schiffe auf dem Feld)
- Ship.h Ship.cpp (Elternklasse der Schiffe)
- *ship.h *ship.cpp (Alle Schiffe)
»MatStorm« hat folgende Dateien angehängt:
  • Game.part1.rar (921,6 kB - 611 mal heruntergeladen - zuletzt: 03.04.2024, 06:47)
  • Game.part2.rar (921,6 kB - 495 mal heruntergeladen - zuletzt: 02.03.2024, 19:46)
  • Game.part3.rar (209,05 kB - 142 mal heruntergeladen - zuletzt: 21.03.2024, 08:36)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

14.08.2013, 12:30

"using namespace" ist in Headern übrigens immer eine ganz schlechte Idee, zudem ist ein Ship kein Sprite, sondern hat.
Ansonsten seh ich erstmal nix wirklich ernstes. Dir fehlt nach dem Zeichnen des Fogs allerdings ein display() auf der RenderTexture.
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]

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

3

14.08.2013, 12:46

Warum ist using namespace eine schlechte Idee? die SFML-Klassen führe ich ja immer mit sf:: ein, deshalb kann ja keine "verwechslung" zwischen std und sf stattfinden, oder?

Ich ändere das dann so ab: Ship hat eine Instanz sf::Sprite (private) und mit GetSprite übergebe ich dann eine Referenz des Sprites.

Was das display() betrifft, ich hatte das vorhin drin, aber als ich den Funktionsaufruf weggelassen habe, ging es trotzdem. Dennoch hinzufügen? Weil die Aufgabe dieser Funktion ist doch eigentlich, das Aktualisieren des RenderTexture, aber wenn es doch sowieso aktuell ist (warum eigentlich?) muss man es trotzdem aufrufen?

Ansonsten Danke für die Antwort :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

14.08.2013, 12:49

Das Display() ist eigentlich sehr wichtig, sonst müsste die Textur auf dem Kopf stehen.
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]

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

5

14.08.2013, 13:11

Okay, dann werde ich es wieder hinzufügen.

Aber warum habe ich so eine niedrige Framerate?
Über den Nebel habe ich mir bereits Gedanken gemacht, da ich ja ein Viereck der Größe des Levels erstelle (10.000 x 10.000 px) und daher ja den gesamten Nebel rendert. Das ändere ich noch ab, sodass das Nebelfeld nur so groß wie der Bildschirm ist.

Wie könnte ich die Framerate aber noch erhöhen? Ich benutze eine Nvidia GT635M und habe eine niedrige FPS mit wenigen Objekten. Wenn jetzt jemand mit einer älteren Grafikkarte das Spiel spielen würde, und da würden ja dann mehr als die ~20 Objekte existieren, dann würde das Spiel ja so sehr hängen, dass man es nicht einmal spielen könnte.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

14.08.2013, 13:44

Über den Nebel habe ich mir bereits Gedanken gemacht, da ich ja ein Viereck der Größe des Levels erstelle (10.000 x 10.000 px) und daher ja den gesamten Nebel rendert. Das ändere ich noch ab, sodass das Nebelfeld nur so groß wie der Bildschirm ist.

Das wird aber dadurch nicht schneller, die Grafikkarte schneidet das sowieso zurecht.
An deiner Stelle würde ich einen Profiler benutzen. Der wird dir zeigen, in welchem Teil des Programms die meiste Zeit draufgeht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

14.08.2013, 13:49

Das Ding ist 10k² groß? Wozu das? Es reicht doch, wenn es so groß ist wie der Screen. Mehr kann man doch eh nicht sehen. Das würde ich auf jeden Fall ändern an Deiner Stelle.
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]

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

8

14.08.2013, 14:21

Das wird aber dadurch nicht schneller, die Grafikkarte schneidet das sowieso zurecht.
Ja die Grafikkarte wird da wegschneiden was nicht gebraucht wird, aber wenn da 10k x 10k Pixelinformation von CPU zu GPU muss, dann kann das doch recht zu Problemen führen...
Wie wird der Nebel denn eigentlich generiert?
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

14.08.2013, 14:31

Er rendert da Sprites in eine RenderTexture. Also eigentlich schon recht optimal. Ist halt nur gigantisch groß das Teil.
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]

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

14.08.2013, 14:35

Mir ist etwas im Ressource Manager aufgefallen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
sf::Texture *cRM::GetTexture(string name)
{
    for(map<string, sf::Texture>::iterator i = textures.begin(); i != textures.end(); i++)
    {
        if(name == i->first) return &(i->second);
    }
    return NULL;
}


Warum benutzt du nicht std::map::find()?

Und:

C-/C++-Quelltext

1
2
seconds = clock.getElapsedTime().asSeconds();
clock.restart();


=>

C-/C++-Quelltext

1
seconds = clock.restart().asSeconds();

Werbeanzeige