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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

04.08.2010, 08:51

Also ich bin ja immer für die generelle Lösung die Position nicht inkrementell von Frame zu Frame durch Framezeiten auszurechnen weil sich numerische Fehler immer schön addieren, sondern eine Gesamt-Strecke seit Bewegungs-Start zu verwenden:
vPos = vStartPos + vVelocity * (CurrentTime - StartTime)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

04.08.2010, 12:08

Und 30fps sind übrigens ein wenig wenig. ;)
Kommt drauf an wofür. ;)
Aber du hast recht, in den meisten Fällen ist es wahrscheinlich zu wenig.
Sollte nicht als konkret vorgeschlagener Wert für die Framerate dienen, sondern nur eine Anregung sein.


Gruß
SaRu_

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

13

04.08.2010, 18:20

In welcher Größenordnung befindet sich denn dein Geschwindigkeitsunterschied ?
Ein paar Prozent sind schon denkbar, weiterhin sind einige Timer unter Windows sehr ungenau.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

04.08.2010, 20:54

Hat SFML keine get_ticks Funktion oder delay Funktion wie SDL?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

15

04.08.2010, 22:37

So nachdem wir nun alle Seiten aufgezählt haben wo man seinen Code posten kann...

In welcher Größenordnung befindet sich denn dein Geschwindigkeitsunterschied ?
Ein paar Prozent sind schon denkbar, weiterhin sind einige Timer unter Windows sehr ungenau.


Ein paar Prozent wären ja noch okay. Allerdings ergibt sich bei der Multiplikation der beiden Faktoren auf meinen Notebook ein Speed von ca. 16.xxxx auf meinem Desktop Pc allerdings nur 2.xxxxx. Also schon ein krasser unterschied.

Was wollt ihr denn für Code sehen? Ich weiss ehrlich gesagt nicht was ich zeigen soll. Ich poste jetzt erstmal die Move Funktion vom Spieler und wo ich mir die vergangene Zeit hole.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CPlayer::move(bool up, bool down, float time)
{
    
    if ((up) && (ypos > 0))
    {
    
    this->ypos -= 8000 * time; 
    
    psprite_player->setpos (xpos,ypos);

    }

    if ((down) && (ypos < 701))
    {
    
    this->ypos += 8000 * time; 
    psprite_player->setpos (xpos,ypos);

    }

}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
float CTimer::getframetime ()
{
temp = 0;


temp = Clock.GetElapsedTime ();
Clock.Reset ();



return temp;

}

16

04.08.2010, 23:03

Wie gesagt solltest du die Framerate limitieren, falls du das noch nicht machst...
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

04.08.2010, 23:03

Die Framerate sollte man sowieso begrenzen. Aber das löst das Problem ja nicht.
Und 30fps sind übrigens ein wenig wenig. ;)

Also ich mach das immer

C-/C++-Quelltext

1
2
3
float timestep = window.GetFrametime() / (1.f / window.GetFramerateLimit())
...
pos = velocity * timestep
Oder so.


Was is da der Trick? Wieso multiplizierst du nicht einfach?
@D13_Dreinig

18

04.08.2010, 23:10

Was is da der Trick? Wieso multiplizierst du nicht einfach?
Öh... Wieso ich nicht einfach * frametime mache?
Weil so bei "perfekter" Frametime der Timestep 1.0 ist, was ziemlich praktisch finde...
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

04.08.2010, 23:13

Was is da der Trick? Wieso multiplizierst du nicht einfach?
Öh... Wieso ich nicht einfach * frametime mache?
Weil so bei "perfekter" Frametime der Timestep 1.0 ist, was ziemlich praktisch finde...


Wieso du nicht timestep = window.GetFrametime() * window.GetFramerateLimit() nimmst..
@D13_Dreinig

20

04.08.2010, 23:17

Wieso du nicht timestep = window.GetFrametime() * window.GetFramerateLimit() nimmst..
Oh Mann, ich Idiot. xD Hast recht, hab wohl nicht richtig nachgedacht.
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

Werbeanzeige