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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

17.12.2008, 15:46

[erledigt]Feste Framerate

Hi, vll wurde schon mal sollch ein Thread erstellt aber ich hab nix gefunden.

Also:
Wie kann ich eine feste Framerate einstellen so das das ganze nicht zu schnell läuft.
z.b. auf 60 FPS setzen.

hab war gefuden weiß aber nicht ob das wirklich sicher ist.

C-/C++-Quelltext

1
2
3
if ( get_ticks() < 1000 / FPS ) ) { //FPS = 60

Sleep( ( 1000 / FPS ) - get_ticks() );
}

Anonymous

unregistriert

2

17.12.2008, 15:58

Na ja, also eine Frame-Bremse ist immer das Schlechteste was man für Timing machen kann. Warum benutzt du nicht die Deltas der Zeit?

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

17.12.2008, 16:00

Bin noch in solchen sachen Anfänger , was meist du

Anonymous

unregistriert

4

17.12.2008, 16:01

Na ja, durch dein vorhaben bremst du die komplette Fenstersteuerung und Systemsteuerung deines Programms regelrecht aus.

Darum ist es immer hilfreich die Zeit vor dem Rendern und nach dem Rendern zu erfassen und den daraus resultierenden Delta für deine Bewegungen usw. zu benutzen.

5

17.12.2008, 16:12

Zitat von »"unsigned long"«

Darum ist es immer hilfreich die Zeit vor dem Rendern und nach dem Rendern zu erfassen und den daraus resultierenden Delta für deine Bewegungen usw. zu benutzen.
Aber das resultiert doch häufig in zusätzlichen Abfragen, weil dadurch Konflikte entstehen können. Beispielsweise mit der Kollision; wenn die Framerate gerade niedrig ist, können Objekte durch andere hindurchrutschen...

Was ist so schlimm an einer Framebremse, wenn einem eine gewisse Anzahl Frames für ein flüssiges Spiel reichen?

Anonymous

unregistriert

6

17.12.2008, 16:18

Nexus
Wenn einem sowas passiert, sollte man seine Berechnungen noch einmal überdenken, da man viel zu kurz gedacht hat. Wenn ich einen Punkt bewege prüfe ich noch vor der Kollisionsroutine ob es da eine Kollision geben könnte und dann prüfe ich diese mit dem möglichen Objekt.

Windows kann Nachrichten nicht mehr Just-In-Time verarbeiten und so könnten wichtige Nachrichten "verschluckt" werden oder treffen zu spät ein, was enorme Folgeschäden mit sich führen könnte.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

17.12.2008, 16:20

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//update input

//clear screen

//rechnen,rendern

if ( get_ticks() < 1000 / FPS ) ) { //FPS = 60

Sleep( ( 1000 / FPS ) - get_ticks() );
} 
//update screen

//input anfrage


hmmm,ja das sleep hier könnte probleme machen

edit:
hab es mal so versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
//update input

//clear screen

if(get_frames() % 60 <= 0){ //bei jeden 60tel frame rendern

  //rechnen,rendern

}
//update screen

//input anfrage

weiß aber nicht ob das die elegantere lösung ist

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

17.12.2008, 16:26

Dann schaust du halt zuerst ob es kleiner 60 ist und renderst dann sowieso, wenn es kleiner ist.
Edit:
Das oben hat sich wohl erledigt. :)


Man könnte das ganze auch mit Threads lösen..

Anonymous

unregistriert

10

17.12.2008, 16:34

Ich habe mal schnell was aus dem Kopf zusammengeschustert, ist eine sehr einfache Hauptschleife. Wenn ich wieder zu hause bin kann ich mal eine von meinen Programmen posten die etwas umfangreicher sind ;)

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
::MSG   message = { 0 };
::DWORD time_current = 0L;
::DWORD time_next = 0L;

    // Zeit-Stempel initialisieren

time_current = time_next = ::timeGetTime ();

    // Erste Message holen:

::PeekMessage (&message, NULL, 0, 0, PM_NOREMOVE);

    // Programm durchstarten:

while (message.message != WM_QUIT)
{
        // Ist eine Nachricht bereit für die Verarbeitung?

    if (::PeekMessage (&message, NULL, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage (&message);
        ::DispatchMessage (&message);
    }
        // Alle Nachrichten sind verarbeitet, jetzt sind wir dran

    else
    {
            // Aktuelle Zeit holen.

        time_current = ::timeGetTime ();
        
            // Delta-Zeit berechnen.

        const ::DWORD time_delta = time_current - time_next;
        
            // Updaten und Zeichnen

        update (time_delta);
        render (time_delta);
        
            // Die aktuelle Zeit ist die Alte.

        time_next = time_current;
    }
}

// [...]

void update (::DWORD delta)
{
    const double millisecond_elapsed = static_cast<double>(delta) / 1.000;
    
        // Mach was mit der Zeit: (Objekt bewegt sich 200 Einheiten pro Sekunde.

    object.x += 200.0 * millisecond_elapsed;
}

Werbeanzeige