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

1

09.04.2012, 01:36

SFML - Anwendung verlangsamt sich

Hey Community

Ich habe es jetzt endlich fertig gekriegt eine map mit einem Pacman zu erstellen als Spiel, doch
je mehr ich hinzufüge desto langsamer wird meine Anwendung..
Seht ihr vielleicht starke Performance Fresser?

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
#include <SFML\Audio.hpp>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <Windows.h>
#include <iostream>
#include <sstream>


using namespace std;

 bool rectangleCollision(const sf::Vector2f& position1, float width1, float height1,
                        const sf::Vector2f& position2, float width2, float height2)
    {
    return position1.x < position2.x + width2  &&
        position2.x < position1.x + width1  &&
        position1.y < position2.y + height2 &&
        position2.y < position1.y + height1;
    }

int main()
{
    

    sf::RenderWindow App(sf::VideoMode(1366,768) , "Game" );
    sf::Clock clock;

    sf::Image PacO(300,300);
    sf::Image PacC(300,300);
    sf::Image Concrete(1366,768);
    sf::Image Floor(1366,768);
    

    PacO.LoadFromFile("PacManOpen.png");
    PacC.LoadFromFile("PacManClose.png");
    Concrete.LoadFromFile("Wall.png");
    Floor.LoadFromFile("Grass.png");
    
    
    
    long Touble = 0;
    sf::Vector2f WallLeft(0.0f,0.0f);
    sf::Vector2f WallRight(1276.0f,0.0f);
    sf::Vector2f WallUp(0.0f,0.0f);
    sf::Vector2f WallDown(0.0f,688.0f);
    

    sf::Sprite PAC;
    sf::Sprite Wall(Concrete);
    sf::Sprite Grass(Floor);

    Grass.SetPosition(0,0);
    Wall.SetPosition(0,0);
    PAC.SetPosition(100,100);
    
    
    
    sf::Font MyFont;
    MyFont.LoadFromFile ("arialbd.ttf" , 26);

    sf::String Text;
    
    Text.SetFont(MyFont);
    Text.SetSize(50);
    Text.SetColor(sf::Color(0,0,0));
    

    
    while(App.IsOpened())
    {
        App.Clear();
        
        
            Touble++;
        
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if(Event.Type == sf::Event::Closed)
                App.Close();
        }
        
         
        
                
                if(Touble == 60)
                {
                PAC.SetImage(PacO);
                }
                else if(Touble == 120)
                {
                PAC.SetImage(PacC);
                Touble = 0;
                }
                App.Draw(Grass);
                App.Draw(Wall);
                App.Draw(PAC);
                sf::Vector2f pos = PAC.GetPosition(); 
                std::stringstream strStream;
                strStream << pos.x << " , " << pos.y;
                Text.SetText(strStream.str());
            
                  
                App.Draw(Text);
                
                  
                App.Display();
                
                

                float ElapsedTime = App.GetFrameTime();
                
if(rectangleCollision(pos,300,300,WallLeft,90,768))
                PAC.SetX(90);
if(rectangleCollision(pos,300,300,WallRight,90,768))
                PAC.SetX(976);
if(rectangleCollision(pos,300,300,WallUp,1366,80))
                PAC.SetY(80);
if(rectangleCollision(pos,300,300,WallDown,1366,80))
                PAC.SetY(388);

if (App.GetInput().IsKeyDown(sf::Key::Left))  PAC.Move(-2, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)) PAC.Move( 2, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up))  PAC.Move(0, -2);
if (App.GetInput().IsKeyDown(sf::Key::Down))  PAC.Move(0,  2);

if (App.GetInput().IsKeyDown(sf::Key::Left)&&App.GetInput().IsKeyDown(sf::Key::Space))  PAC.Move(-3, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)&&App.GetInput().IsKeyDown(sf::Key::Space)) PAC.Move( 3, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up)&&App.GetInput().IsKeyDown(sf::Key::Space))    PAC.Move(0, -3);
if (App.GetInput().IsKeyDown(sf::Key::Down)&&App.GetInput().IsKeyDown(sf::Key::Space))  PAC.Move(0,  3);

    }

    return 0;
}

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

2

09.04.2012, 02:27

Ich kann mich daran erinnern, dass Nachoman11 dir geraten hatte SetSubRect zu verwenden ( d.h. beide Bilder in einer Datei zu speichern und nicht separat in zwei Dateien ).
Das solltest du als aller erstes mal ändern...

Freundliche Grüße
Stazer

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

3

09.04.2012, 08:55

Bevor du hier optimierst, was heißt denn, sie wird immer langsamer?

Klar ist, wenn du einen leeren Bildschirm renderst, hast du viel mehr Frames, als wenn du dann anfängst, etwas zu zeichnen. Kann mir nicht vorstellen, dass du schon unter 60 fps kommst.

Ich kenn die SFML leider nicht, aber ich schätze auch die wird so schnell updaten wie sie kann. Deshalb musst du die Figur in Abhängigkeit zur Framezeit bewegen, sonst hast du je nach Rechnerpower das Gefühl die Spielfigur läuft mal schneller und mal langsamer.

Grund dafür ist, dass du mit festen Schritten die Figur bewegst. Wenn die Szene jetzt 120 mal pro Sekunde aktualisiert wird, bewegst du dich doppelt so schnell, als wenn ie Szene 60 mal pro Sekunde aktualisiert würde.Durch das Hinzufügen von Elementen verändert sich natürlich die Anzahl an Updates und du hast daher wahrscheinlich das Gefühl, das Spiel wird immer langsamer, dabei ist es eigentlich nur die Spielfigur.

4

09.04.2012, 11:23

Mach das mal hier:

C-/C++-Quelltext

1
if (App.GetInput().IsKeyDown(sf::Key::Left)&&App.GetInput().IsKeyDown(sf::Key::Space))  PAC.Move(-3 * ElapsedTime, 0);
und bei den anderen auch dann.

5

09.04.2012, 11:36

@ C++Coder: Danke nochmal ;)

@ Sp3iky: Kann man das umgehen ich meine wenn die spielbewegungsgeschwindigkeit von der Framerate
abhängig ist dann haben schnellere PC demnach entweder ein Vor oder Nachteil.

Gelöschter Benutzer

unregistriert

6

09.04.2012, 11:42

Diese Wikiseite hilft dir bestimmt weiter: https://www.spieleprogrammierer.de/wiki/…gige_Spiellogik

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

7

09.04.2012, 12:07

@ C++Coder: Danke nochmal ;)

@ Sp3iky: Kann man das umgehen ich meine wenn die spielbewegungsgeschwindigkeit von der Framerate
abhängig ist dann haben schnellere PC demnach entweder ein Vor oder Nachteil.



Wenn du das gemacht hast, was C++-Coder geschrieben hast, wendest du bereits die Lösung des Problems an. Ich wollte nur, dass du auch verstehst, wie es dazu kommt und was passiert^^Füge also inhaltlich die beiden Beiträge zusammen. Dann weißt du auch, warum der Code das Problem löst.

8

09.04.2012, 12:40

Nochwas: Du erstellst manche Variablen immer neu in der Schleife, wie z.B. ElapsedTime. Das kannst du vor der Schleife machen und in der Schleife nur den Wert zuweisen. Es ist vielleicht für dich im Moment nicht wichtig, aber bei größeren Projekten spürt man den Performanceverlust.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

09.04.2012, 12:50

Nochwas: Du erstellst manche Variablen immer neu in der Schleife, wie z.B. ElapsedTime. Das kannst du vor der Schleife machen und in der Schleife nur den Wert zuweisen. Es ist vielleicht für dich im Moment nicht wichtig, aber bei größeren Projekten spürt man den Performanceverlust.

Blödsinn. Ich hab ihm in seinem letzten Thread erklärt, dass es besser ist Objekte so spät wie möglich zu definieren, wenn die Konstruktion nicht besonders lang dauert. Gerade bei der dieser Variable und Schleife wird man es niemals merken...

Solche Optimierungen nimmt man übrigens erst vor, wenn das Spiel funktioniert und so gut wie fertig ist.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

09.04.2012, 13:28

Nochwas: Du erstellst manche Variablen immer neu in der Schleife, wie z.B. ElapsedTime. Das kannst du vor der Schleife machen und in der Schleife nur den Wert zuweisen. Es ist vielleicht für dich im Moment nicht wichtig, aber bei größeren Projekten spürt man den Performanceverlust.

Ich stimme NachoMan zu, das ist Blödsinn.
Ich frage mich, woher solche Aussagen kommen. Falsches Halbwissen gemischt mit Bauchgefühl, wird aber dann als eigene Erfahrung verkauft.

Werbeanzeige