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

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

1

03.07.2013, 16:23

SFML Spiel hat nur wenig FPS

Hallo liebe Spieleprogrammierer Community,

ich habe ein kleines Problem, wer hätte das gedacht :D
Hab dazu schon gegooglet, aber keine wirklich hilfreiche Antwort gefunden.

Also folgendes: Ich habe ein Spiel in einem sehr frühen Stadium, bei dem im Moment im Prinzip nur der Spieler bewegt werden kann und ein Hintergrund vorhanden ist.
Im Debug Modus habe ich lediglich 3 - 6 FPS, beim releasten Spiel sind es 10 - 16 FPS. Ich nehme an das ich die Texturen einfach irdenwie falsch aufrufe, denn die Bilder sind wirklich klein. Der Hintergrund hat 2048 * 1152 Pixel und ist eine 45 KB große png Datei. Der Hintergrund bewegt sich mit dem Spieler. Selbst im Menü wo nur ein Bild in größe von 1600 * 900 angezeigt wird sind es nur 111 FPS (Das finde ich wenig für einen Bildschirm wo nichts passiert).

game.cpp

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include "game.hpp"


void CGame::Run(CFramework *Background)
{
    bGameRun = true;
    CPlayer Player;
    CClock FPS;
    bool map=false;
    int XposPL=0;
    int YposPL=0;
    int sprint=200;
    float RP=100;
    float XposBG=0;
    float YposBG=0;
    sf::Clock clock;
    sf::Time elapsed;
    while(bGameRun==true)
    {
    Background->Clear();
    std::cout<<FPS.Clock()<<std::endl;
    elapsed=clock.getElapsedTime();//Verstrichene Zeit seit dem letzten Frame
    clock.restart();
    Background->Run("Data/Textures/background.png",XposBG, YposBG);//Hintergrund; 7 FPS (Debug)
    Player.Char(Background,XposPL,YposPL);//Player
    Player.HP(Background);//Healthpoints
    Player.RP(Background,RP);//Runpoints
    Player.HPR(Background);//Rahmen vom HP und RP
    if(map==true)
    {
        Player.Map(Background);//Übersichtskarte
    }
    Background->Display();
    
    while(Background->Window->pollEvent(event))
        {
            if(event.type == event.KeyPressed)
            {
                if(event.key.code == sf::Keyboard::Escape || event.Closed==true)
                {
                    bGameRun=false;
                    CMenu Menu;
                    Menu.Menu(Background);
                }
            }
        }

    
                //Steuerung
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::M))//Map aufrufen
                {
                    if(map==false)
                    {
                    map=true;
                    }
                    else
                    {
                    map=false;
                    }
                }
                if(!sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))//Sprinten aufladen
                {
                    RP+=2*elapsed.asSeconds();
                    sprint=200;
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))//Sprinten
                {
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                    {
                        RP-=5*elapsed.asSeconds();
                        XposPL=0;
                        YposPL=64;
                        XposBG+=sprint*elapsed.asSeconds();
                        if (XposBG>=1200)
                            XposBG=1200;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
                    {
                        RP-=5*elapsed.asSeconds();
                        XposPL=64;
                        YposPL=64;
                        XposBG-=sprint*elapsed.asSeconds();
                        if (XposBG<=-700)
                        XposBG=-700;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
                    {
                        RP-=5*elapsed.asSeconds();
                        XposPL=64;
                        YposPL=0;
                        YposBG-=sprint*elapsed.asSeconds();
                        if (YposBG<=-350)
                        YposBG=-350;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                    {
                        RP-=5*elapsed.asSeconds();
                        XposPL=0;
                        YposPL=0;
                        YposBG+=sprint*elapsed.asSeconds();
                        if (YposBG>=625)
                        YposBG=625;
                    }   
                }

                else if(sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))//Schleichen
                {
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                    {
                        XposPL=0;
                        YposPL=64;
                        XposBG+=50*elapsed.asSeconds();
                        if (XposBG>=1200)
                            XposBG=1200;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
                    {
                        XposPL=64;
                        YposPL=64;
                        XposBG-=50*elapsed.asSeconds();
                        if (XposBG<=-700)
                        XposBG=-700;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
                    {
                        XposPL=64;
                        YposPL=0;
                        YposBG-=50*elapsed.asSeconds();
                        if (YposBG<=-350)
                        YposBG=-350;
                    }
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                    {
                        XposPL=0;
                        YposPL=0;
                        YposBG+=50*elapsed.asSeconds();
                        if (YposBG>=625)
                        YposBG=625;
                    }   
                }
                else//normales gehen
                {
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))//Normal
                {
                    XposPL=0;
                    YposPL=64;
                    XposBG+=100*elapsed.asSeconds();
                        if (XposBG>=1200)
                            XposBG=1200;
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
                {
                    XposPL=64;
                    YposPL=64;
                    XposBG-=100*elapsed.asSeconds();
                        if (XposBG<=-700)
                        XposBG=-700;
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
                {
                    XposPL=64;
                    YposPL=0;
                    YposBG-=100*elapsed.asSeconds();
                    if (YposBG<=-350)
                        YposBG=-350;
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                {
                    XposPL=0;
                    YposPL=0;
                    YposBG+=100*elapsed.asSeconds();
                        if (YposBG>=625)
                        YposBG=625;
                }   
                }
    if (RP<=0)
    {
        RP=0;
        sprint=100;
    }
    else if (RP >=100)
        RP=100;
    }
}


framework.cpp

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "framework.hpp"

CFramework::CFramework(int WinWidth, int WinHeight)
{
    Window = new sf::RenderWindow(sf::VideoMode(WinWidth,WinHeight,32),"Das Spiel",sf::Style::Default);
    std::cout << "Konstruktor wurde aufgerufen\n";
}


void CFramework::Run(std::string Filename,float XposBG, float YposBG)
{
    sf::Texture TextureBG;
    TextureBG.loadFromFile(Filename);
    std::cout << "Textur von " << Filename << " aufgerufen \n";

    sf::Sprite SpriteBG;
    SpriteBG.setTexture(TextureBG);
    SpriteBG.setPosition(0,0);
    SpriteBG.setTextureRect(sf::IntRect(XposBG,YposBG,1600,900));
    SpriteBG.scale(1.0,1.0);
    std::cout << "Textur formatiert\n";

    CFramework::Draw(SpriteBG);
}   

void CFramework::Clear()
{
    Window->clear(sf::Color(0,0,0));
    std::cout << "Fenster gelöscht\n";
}
void CFramework::Draw(sf::Sprite Sprite)
{
    Window->draw(Sprite);
    std::cout << "Fenster gezeichnet\n";
}
void CFramework::Display()
{
    Window->display();
    std::cout << "Fenster angezeigt\n";
}


Hoffe ihr habt da eine Idee. Wenn ihr noch Codezeilen braucht, schreibt es einfach.

Danke und Gruß
Ich war hier und hab ALLES gesehen!

Union_Freedom

Treue Seele

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

2

03.07.2013, 16:36

Hey,

ich kenne mich zwar mit der SFML kaum aus, aber was macht den Background->run("..."). Das sieht fast so aus, als wenn du in jeder Gameloop Grafiken lädst. Wenn ja, wird es wohl daran liegen.

MfG
Union_Freedom
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

3

03.07.2013, 16:48

Hallo Union_Freedom,

danke für deine Antwort. Ja das ist korrekt, bei jedem Loop wird die Grafik aus dem Ordner geladen und formatiert. Danach wird es dann gezeichnet.
Hmm es ist halt dann die Frage wie ich das sonst lösen soll, ohne das immer wieder zu laden, da ich ja immer einen anderen Ausschnitt des Bildes benötige :S

Gruß
Encounter
Ich war hier und hab ALLES gesehen!

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

03.07.2013, 16:50

Du lädst die Grafiken, die du benötigst im Konstruktor in eine Membervariable. Vor dem Zeichnen kannst du ja daraus ein Sprite erstellen und zeichnen.

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

5

03.07.2013, 17:09



Du lädst die Grafiken, die du benötigst im Konstruktor in eine Membervariable. Vor dem Zeichnen kannst du ja daraus ein Sprite erstellen und zeichnen.
Super, jetzt funkioniert es :) Hätte ich auch selber drauf kommen können -.- Naja manchmal hat man halt ein Brett vorm Kopf :)

Danke patrick246 und Union_Freedom, das hat mir sehr weitergeholfen und ist genau das was ich gesucht habe. :thumbsup:
Ich war hier und hab ALLES gesehen!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

03.07.2013, 18:33

Du kannst bei der Sprite auch einfach das Rect anpassen, welches gezeichnet wird. So musst du auch die Sprite nicht jedes mal neu erstellen.
„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.“

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

7

03.07.2013, 18:44

Das ist die Dokumentation von SFML 1.6, in 2.0 heißt diese Funktion setTextureRect und er verwendet sie auch schon.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

03.07.2013, 18:54

Muss er ja auch wenn er nur einen Ausschnitt rendern möchte. Was er allerdings nicht muss ist jedes mal die Sprite neu zu erstellen. Das war der wichtige Teil in meiner Antwort. Das mit der falschen Doku tut mir leid. Hab das auf die schnelle bei Google gesucht. Hätte ich genauer gucken sollen.
„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

03.07.2013, 18:56

Das Sprite neu zu erstellen ist nicht das Problem, sondern das Laden der Bilder ;)
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]

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

10

03.07.2013, 19:41

Für alle die eventuell mal zukünfig auf diesen Threat stoßen, hier mal der Codeauschnitt wie er jetzt angepasst wurde.
Werde das aber nochmal optimieren indem ich mir eine eigene Sprite Klasse erstellen werde, sonst muss ich alles 10 mal schreiben :D

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "framework.hpp"

CFramework::CFramework(int WinWidth, int WinHeight)
{
    Window = new sf::RenderWindow(sf::VideoMode(WinWidth,WinHeight,32),"Das Spiel",sf::Style::Default);
    std::cout << "Konstruktor wurde aufgerufen\n";

    TextureMenuBG = new sf::Texture ;
    TextureMenuBG->loadFromFile("Data/Textures/menue.png");
    std::cout << "Textur von " << "Data/Textures/menue.png" << " aufgerufen \n";

    TextureGameBG = new sf::Texture ;
    TextureGameBG->loadFromFile("Data/Textures/background.png");
    std::cout << "Textur von " << "Data/Textures/background.png" << " aufgerufen \n";
}

void CFramework::RunMenu()
{

    sf::Sprite SpriteBG;
    SpriteBG.setTexture(*TextureMenuBG);
    SpriteBG.setPosition(0,0);
    SpriteBG.setTextureRect(sf::IntRect(0,0,1600,900));
    SpriteBG.scale(1.0,1.0);
    std::cout << "Textur formatiert\n";

    CFramework::Draw(SpriteBG);
}   

void CFramework::RunGame(float XposBG, float YposBG)
{

    sf::Sprite SpriteBG;
    SpriteBG.setTexture(*TextureGameBG);
    SpriteBG.setPosition(0,0);
    SpriteBG.setTextureRect(sf::IntRect(XposBG,YposBG,1600,900));
    SpriteBG.scale(1.0,1.0);
    std::cout << "Textur formatiert\n";

    CFramework::Draw(SpriteBG);
}
Ich war hier und hab ALLES gesehen!

Werbeanzeige