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

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

11

23.07.2007, 01:51

mit einem timer gibts du einen (weitgehend) systemunabhängigen takt vor, mit dem du aufeinanderfolgende frames mit konstanter geschwindigkeit abspielen kannst.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

12

23.07.2007, 01:58

Mein Problem ist nicht die taktung der frames, sondern das abwarten der überflüssigen zeit... diese will ich verschenken...

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

13

23.07.2007, 02:09

ich nehm sie gerne :)
aber ich denke solange dein programm auf keine anderen nachrichten reagiert, verteilt das OS die zeit schon von alleine.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

14

23.07.2007, 02:18

Nein, ich rase dauernd durch eine Schleife die CPU frisst...

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
    while (!Finish)
    {
        SDL_Event Event;
        while(SDL_PollEvent(&Event))
        {
            switch(Event.type)
            {
            case SDL_QUIT:
                Finish = true;
                break;
            case SDL_KEYDOWN:
                if (Event.key.keysym.sym == SDLK_ESCAPE)
                    Finish = true;
                break;
            }
        }


        if((SDL_GetTicks() - Duration) >= DefinedLoopDuration)
        {
            Duration = SDL_GetTicks();

            //Hier soll alles gerendert werden...


            SDL_GL_SwapBuffers();
        }
    }

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

15

23.07.2007, 02:28

ja, und genau aus dem grund sollst du ja auch einen timer verwenden ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// pseudocode


sende_timer_nachrichten(10); // alle 10 sekunden


if(nachricht_an_das_programm())
{
     if(nachricht == timer_nachricht)
                   zeichne_frame();
}
"Don't trust your eyes: They are a hell of a lot smarter than you are"

16

23.07.2007, 02:54

Geht das mittels der SDL?
Ich wüsste nicht wie... jedenfalls nicht mit den Timer funktionen... muss mal bei dem Multithreading schauen...

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

17

23.07.2007, 07:46

Also man kann natürlich in einer Schleife bleiben bis die Frametime abgelaufen ist, das ist aber sehr ineffektiv, weil man wertvolle CPU-Zeit verschwendet, man sollte also lieber die CPU abgeben. Logischerweise ist da die einzige vernünftige Möglichkeit eine Funktion vom Betriebssystem zu verwenden, weil das die CPU verwaltet. Unter Windows also Sleep(). Wenn dir das zu ungenau ist, benutz doch Sleep einfach nur solange, bis die Framezeit einen bestimmten Wert erreicht hat, und ab dann eine Schleife.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

18

23.07.2007, 10:18

Re usleep: Gleich der erste Google Hit sieht gut aus.

Re Sleep: Es ist nach meiner Erfahrung genau genug für den Zweck. Wir haben in unserem FluSi eine ähnliche Funktion drin (und optional sogar genau die "Nagel die framerate auf einen hardcodierten Wert fest" Methode die Tobb anstrebt, aber aus anderen Gründen) und nutzen Sleep. Das Program ist nur für Win32.

Auf jeden Fall muss man sich sowohl bei Tobbs Ansatz als auch bei Timern überlegen was passiert wenn in einer Situation (z.B. viele Feinde auf dem Bildschirm) die vorgegebene FPS rate nicht eingehalten werden kann. Dann ist ja das in die PhysikEngine hardcodierte delta-t nicht mehr richtig.

Ich habe auch schon von folgender Methode gehört:
Man macht Multithreading und läßt den Physikthread mit der angegebenen Rate laufen. Ich kann mich nicht mehr an Details erinnern, aber IMO macht das nur Sinn wenn der Physikthread öfter aufgerufen wird als der Thread, der die Grafik beinhaltet. Nur der Physikthread muss eine feste Rate haben.
"Games are algorithmic entertainment."

19

23.07.2007, 14:04

Da ich platformunabhängig programmiere fange ich mit Sleep nichts an, da es Windows spezifisch ist.

Zitat von »"rewb0rn"«

Also man kann natürlich in einer Schleife bleiben bis die Frametime abgelaufen ist, das ist aber sehr ineffektiv, weil man wertvolle CPU-Zeit verschwendet, man sollte also lieber die CPU abgeben. Logischerweise ist da die einzige vernünftige Möglichkeit eine Funktion vom Betriebssystem zu verwenden, weil das die CPU verwaltet. Unter Windows also Sleep(). Wenn dir das zu ungenau ist, benutz doch Sleep einfach nur solange, bis die Framezeit einen bestimmten Wert erreicht hat, und ab dann eine Schleife.

Das Problem ist aber das ein SDL_Delay(0) schon zu viel Zeit verstreichen lässt...
Wenn ein SDL_Delay(0) mal gerade 12ms verschläft (was bei mir schon vorgekommen ist) dann bremst das die Rate schon auf (1000 / 12) = 83,3 FPS. Da meine feste FPS 80 beträgt dürfte der Logik- und der Grafikteil nur 0,5ms (1000 / (12 + 0,5) = 80) verbrauchen ansonsten liegt die Zeit leider schon darüber... und es ruckelt.

Zitat von »"Osram"«


Re usleep: Gleich der erste Google Hit sieht gut aus.

Re Sleep: Es ist nach meiner Erfahrung genau genug für den Zweck. Wir haben in unserem FluSi eine ähnliche Funktion drin (und optional sogar genau die "Nagel die framerate auf einen hardcodierten Wert fest" Methode die Tobb anstrebt, aber aus anderen Gründen) und nutzen Sleep. Das Program ist nur für Win32.

Wie gesagt... Sleep hilft mir nicht...
Und zu usleep habe ich nichts gefunden, dass mir sagt, dass es zum C++ Standard gehört... deshalb kann ich es auch nicht nehmen.

Zitat von »"Osram"«


Auf jeden Fall muss man sich sowohl bei Tobbs Ansatz als auch bei Timern überlegen was passiert wenn in einer Situation (z.B. viele Feinde auf dem Bildschirm) die vorgegebene FPS rate nicht eingehalten werden kann. Dann ist ja das in die PhysikEngine hardcodierte delta-t nicht mehr richtig.

Was dann passiert ist ganz klar... es wird ruckeln bzw einfach langsamer ablaufen, da das zu kleine delta-t alles abbremst. Deshalb gebe ich dem User auch die Möglichkeit, die feste Framerate zu varieeren. (aber das was ich programmieren will wird, selbst auf alten Gurken noch gut laufen...)

Und bei deinem Vorschalg mit dem Multithreading habe ich doch genaus das gleiche Problem mit der gesuchten/fehlenden sleep Funktion.

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

20

23.07.2007, 14:12

Zitat von »"tobb"«

Geht das mittels der SDL?

Ja, es geht
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Werbeanzeige