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

08.09.2011, 00:12

SDL, komisches verhalten!

Hallo,
Ich hab mal wieder ne Frage:
Ich hab festgestellt, dass mein SDL-Spiel flüssiger läuft, wenn ich in meine Hauptschleife einer Verzögerung von einigen Ticks einbaue..
Das finde ich sehr eigenartig, gibt es dafür eine Erklärung?
Die Verzögerung habe ich mit einer Schleife ungefaehr so..

C-/C++-Quelltext

1
2
3
4
while(1)//Hauptschleife
{
    for(int i=0;i<500000;i++);
}


eingebaut. Danach lief es wie gesagt viel flüssiger!
?(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

08.09.2011, 00:14

Diese Schleife sollte von jedem vernünftigen Compiler wegoptimiert werden (sprich: sie wird gar nicht ausgeführt, weil sie nichts tut) und dürfte eigentlich überhaupt keine Auswirkung auf Dein Programm haben.
Wenn Du wirklich eine Verzögerung willst, dann benutze Sleep.

3

08.09.2011, 00:17

Hi, ja , das ist mir klar , das läuft so nur im Debug Modus..
für Release hab ich das so ähnlich nur mit sleep(0) in der schleife...

also so

C-/C++-Quelltext

1
2
3
4
5
6
7
while(1)//Hauptschleife 
{     
    for(int i=0;i<5000;i++)
    { 
        Sleep(0);
    }
}



Danke

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dr.hallo« (08.09.2011, 00:25)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

08.09.2011, 00:33

Der Code ist trotzdem sinnlos und darf keine Auswirkungen haben, da er entweder wegoptimiert wird oder im Falle mit Sleep(0) allerhöchstens den Programmablauf um ein paar µs verzögert.

FSA

Community-Fossil

  • Private Nachricht senden

5

08.09.2011, 14:45

Ich habe mal gelesen das ein Sleep befehl in einer Schleife den Prozesoor schont.
Bin mir aber nicht ganz sicher.
Aber diese Schleife wird auf jeden fall wegoptimiert, denn das ist ja eigntlich sinnlos!
Ich kann dir noch sagen schalte mal dein Virenschutz aus, das hat bei mir Wunder bewirkt ;-)
MFG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

08.09.2011, 14:48

Nein, wenn Du Sleep in der Schleife aufrufst, wird die nicht wegoptimiert.
Was aber definitiv Quatsch ist, ist Sleep so oft in einer Schleife aufzurufen. Mach Dir erstmal klar, was Sleep eigentlich tut.

... Prozessor schonen ... :D :D :D

Sleep setzt man ein, wenn man weiß, dass das Programm die nächsten X Millisekunden nichts Sinnvolles tun kann.
Dann gibt der Thread/Prozess seine vom Betriebssystem zugeteilte Rechenzeit vorzeitig frei, so dass ein anderer Thread/Prozess den Prozessor benutzen kann.
Man weiß aber nie, wie lange Sleep wirklich schläft.

7

08.09.2011, 22:31

Ja, ok, war vielleicht etwas verwirrend, dass ich jetzt hier Sleep(0) gewählt habe.
Das hatte einzig den Zweck, das die Schleife nicht wegoptimiert wird, ich hätte also
auch jede andere Funktion hier einsetzten können (oder weiß der Henker, was man noch für Möglichkeiten hat eine Verzögerung von weniger als einer Millisekunde hervorzurufen).

Fakt ist, dass das Programm so flüssiger läuft. Auf meinem System ist das Optimum bei 6500 durchläufen erreicht, das heißt also es läuft so sehr flüssig. Bei kleineren und höheren Werten fängts dann wieder an zwar geringfügig aber merklich zu ruckeln (und das eben auch, wenn ich die Schleife auskommentiere). Naja ich hab gedacht, vielleicht tritt da irgendein Effekt im Zusammenhang mit der Bildschirmfrequenz 60 Hz auf... aber so richtig Sinn macht das eigendlich nicht..

Na denn, vielleicht weiß noch einer was..

Danke

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

8

08.09.2011, 22:36

Schalte mal VSync ein und kommentiere die Schleife aus, vielleicht hilft das.

9

09.09.2011, 00:18

Ich habs jetzt auf zwei Rechnern getestet. Auf meinem Notebook kann ich garkein VSync einstellen (Graka Sis Mirage 3), jedenfalls find ich hier nix dazu. Der andere Rechner hat eine 8800er GeForce. Da hab ich mal VSync eingeschaltet, hat aber leider nichts gebracht (aber danke für den Tip), wobei hier auf Grund der besseren Graka der Effekt auch viel schwächer zu Tage tritt. Hier kriege ich bei 5500 ein Optimum, wobei man da schon Erbsenzählen muss um überhaupt einen unterschied zu erkennen.

Das Spiel findet Ihr übrigens hier
http://www.c-sharp-forum.de/topic_Monste…ate_104974.html
(Wie man vielleicht noch schwach erkennen kann ist das mal aus Heiko Kalistas Beispielprojekt hervogegangen :D )

10

10.09.2011, 18:45

Hallo, hab mal etwas weiter geforscht und probiert und mir selbst geholfen..
Was ich mit der Schleife erreicht habe war tatsächlich eine Annäherug der Framerate
an 60 Hz. Da auch mein Bildschirm mit 60 Hz läuft wird das ganze flüssiger. Es gibt
auch die Möglichkeit die Gameloop konstant auf 60 Hz zu halten. Jetzt hab ich es vorerst
so eingestellt..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    _FRTimer = STimer->_ElapsedSec;
        if(_FRTimer < _timePerFrame)
        {
            _nDelay+=100;
            _FRTimer = 0.0f;
        }
        else
        {
            _nDelay-=100;
            if(_nDelay < 0) _nDelay = 0;
            _FRTimer = 0.0f;
        }

        for(int i=0;i<_nDelay;i++)Sleep(0);
        FlipScreen();


Damit ändern sich die Durchläufe dynamisch, und so bleibt die Framerate immer bei ungefär 1/60.
Das Ergebnis ist akzeptabel. vg

EDIT: Was fürn verkorkster code, aber hauptsache funktioniert. Alles sehr eigenartig.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dr.hallo« (10.09.2011, 18:52)


Werbeanzeige

Ähnliche Themen