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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

14.07.2008, 11:10

Timing / Fixed Framerate

Ich habe kürzlich gelesen (im Forum bei gamedev.net), es wäre nicht empfehlenswert, die Grundstruktur eines (komplexeren) Spiels nach dem Muster "wiederhole { move; draw; }" zu gestalten. Es wurde gesagt, kaum ein kommerzielles Spiel würde es so handhaben. Stattdessen solle man die Spielelogik in einer festen Framerate aktualisieren, während das Rendern mit einer variablen Framerate abläuft. Nun habe ich zwei Fragen.

1. Was spricht eurer Meinung nach gegen das "wiederhole { move; draw; }" Prinzip, außer dass physikalische Berechnungen erschwert werden?

2. Wie könnte das beschriebene alternative Konzept genauer aussehen? Leider habe ich dazu keine Informationen finden können. An Multithreading kommt man wohl kaum vorbei? Ich stelle mir das im Pseudocode etwa so vor, was haltet ihr davon?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Programm {
    Starte Thread "Spielelogik"
    Starte Thread "Rendering"
}

Thread "Spielelogik" {
    Zeit0 = Momentane Zeit
    Hole Exklusivzugriff auf Spielelogik
    Aktualisiere Spielelogik
    Gebe Exklusivzugriff auf
    Zeit1 = Momentane Zeit
    Warte 1 / ZielFPS - ( Zeit1 - Zeit0 )
}

Thread "Rendering" {
    Hole Exklusivzugriff auf Spielelogik
    Rendere
    Gebe Exklusivzugriff auf
}


Ich habe mit Threads nur wenig Erfahrung. Macht es eurer Meinung nach Sinn, den Thread zur Aktualisierung der Spielelogik mit einer höheren Priorität zu starten?

Vielen Dank im Voraus.
<< an dieser Stelle ist eine Signatur verstorben >>

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

14.07.2008, 11:42

Davon würd ich abraten... So hast du zusätzlich den ganzen Thread-overhead... naja. Einfacher wäre es da, die die Zeit nach jedem schleifendurchgang zu messen, und aufzuaddieren. Sobald dann genug Zeit "vorhanden" ist, das nächste mal Move und Render aufrufen...

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
while(!og_g_bQuit)
    {
        ogTimer Timer;
        Timer.Start();

        fTime = og_g_Clock.GetPredictedFrameTime();

        //Nachrich empfangen

        while(PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            //Übersetzt eine Nachricht

            ::TranslateMessage(&message);
            //Leitet die Nachricht an die richtige Fensterprozedur weiter

            ::DispatchMessage(&message);
        }

        //Nur wenn das Fenster aktiv ist, sonst PAUSE

        if(og_g_bActivate)
        {
            //Timebased-Rendering

            if(fFixedFrameRate <= 0.f)
            {
                //Rendern und dann Move Funktion

                if(Render(fTime) == OG_STOP) og_g_bQuit = true;
                if(Move(fTime) == OG_STOP)  og_g_bQuit = true;

                //Bildbuffer sichtbar machen

                ogDirect3D::Instance().Present();
            }
            //Framebased-Rendering

            else
            {
                //Alles neu rendern?

                bool bShowScene = false;
                if(bRender)
                {
                    if(Render(fFramePeriod) == OG_STOP) og_g_bQuit = true;
                    bRender     = false;
                    bShowScene  = true;
                }

                while(fTotalPassedTime >= fFramePeriod)
                {
                    //Move-Funktion aufrufen

                    if(Move(fFramePeriod) == OG_STOP) og_g_bQuit = true;
                    fTotalPassedTime -= fFramePeriod;
                    bRender           = true;
                }

                fTotalPassedTime += fTime;
                if(fTotalPassedTime > fMaxTime) fTotalPassedTime = fMaxTime;

                //Present, wenn es änderungen gibt!

                if(bShowScene) ogDirect3D::Instance().Present();
            }

            //Aufgeschobene 3D-Soundänderungen durchführen, falls 3D-Sound initialisiert wurde

            if(og_g_bDirectSoundInit)
            {
                if(ogDirectSound::Instance().GetListener())
                {
                    ogDirectSound::Instance().GetListener()->CommitDeferredSettings();
                }
            }
        }
    }
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

3

14.07.2008, 14:26

TomasRiker hat da in seinem Code ein wie ich finde ganz geniales Konzept mom *link rauskram* https://projects.fslab.de/projects/Rollmorad/browser/trunk/src/application.cpp

ab Zeile: 160
Homepage: fkrauthan.de | Browser-game: flowergame.net

Anonymous

unregistriert

4

14.07.2008, 15:11

Aaah, meine Augen ^^

p.s.: Mach es so wie DU es für richtig hälst.

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

5

14.07.2008, 15:13

Aber Anregungen kann er ja trozdem bekommen. ;)
Homepage: fkrauthan.de | Browser-game: flowergame.net

Anonymous

unregistriert

6

14.07.2008, 15:16

fkrauthan
Allerdings. ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

14.07.2008, 15:52

Zitat von »"fkrauthan"«

TomasRiker hat da in seinem Code ein wie ich finde ganz geniales Konzept mom *link rauskram* https://projects.fslab.de/projects/Rollmorad/browser/trunk/src/application.cpp

ab Zeile: 160


Also ich bekomme bei dem Link nur einen Fehler, wegen Sicherheitszertifikat. Wenn ich überhaupt mal draufkomme. :roll:

8

14.07.2008, 15:53

Zitat von »"drakon"«

Also ich bekomme bei dem Link nur einen Fehler, wegen Sicherheitszertifikat. Wenn ich überhaupt mal draufkomme. :roll:

Dito. Firefox 3, gell?

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

9

14.07.2008, 15:59

Da kannste auch eingeben das du es benutzen magst. Das klappt dann.
Homepage: fkrauthan.de | Browser-game: flowergame.net

Werbeanzeige