 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OLiver Super JLI'ler

Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 04.10.2005, 16:31 Titel: Gedanken zum Timing |
|
|
Hab mir mal ein paar Gedanken über Timing nochmal gemacht, da gibts ja mehrere Möglichkeiten:
1. Man berechnet anhand von der vergangenen Zeit vom letzten Frame die Anzahl der Pixel, die die Figur vorrückt.Also in der Form
CPP: | x +=(( timeGetTime() - lasttime ) * faktor);
|
Dann läuft es überall gleich, allerdings hat die Sache anscheinend einen Haken. Die Figur ruckelt dann irgendwie ziemlich bzw. "vibriert" ( jedenfalls bei mir (?) )
Beispielprogramm, wo es ruckelt... ( Pfeiltasten drücken! )
2. Nach ner bestimmten Zeit wird es einfach um z.B. 5 Pixel vorschoben
CPP: | if(timeGetTime()-lasttime >= 100)
x+=5:
|
Ist ja im Prinzip wie 1., nur das es noch ungenauer ist...
3. Man berechnet jede Sekunde z.B. die Framerate und berechnet dann immer, um wie viel die Figur bei jedem Frame bewegt wird. Dann läuft es zwar flüssig, aber wenn größere Framerate-Schwankungen auftreten, kann es dann ziemlich ungleichmäßig werden.
4. Könnte man ja VSYNC anstellen und dann einfach die Framerate einmalig berechnen, vorrausgesetzt, dass die GraKa auch die Frequenz des Monitors erreicht, und dann immer bei jeden Frame draufaddiert. Dann läuft es flüssig und man hat keine Geschwindigkeitsänderungen. Aber irgendwie gefällt mir das nicht ganz wegen der Vorraussetzung.
Gibt es noch andere Möglichkeiten oder mach ich bei 1. irgendwas falsch?  _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.10.2005, 16:39 Titel: |
|
|
Die erste Möglichkeit (Schrittweite per Zeitdifferenz ermitteln) ist meines erachtens die Beste. Das "Ruckeln" liegt an der niedrigen Auflösung von TimeGetTime() (55 oder 10 Millisekunden, Win9x oder 2k/XP)
Nutze den PerformanceTimer und rechne in kleineren Größeneinheiten und merke dir "halbe Pixel"... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
OLiver Super JLI'ler

Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 04.10.2005, 16:43 Titel: |
|
|
Ich dachte timeGetTime() hat ne Auflösung von 1 Millisekunde, dann brauch ich mich nicht so wundern.  _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 05.10.2005, 10:13 Titel: |
|
|
Die Auflösung von timeGetTime() hängt leider vom Betriebssystem ab  _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
OLiver Super JLI'ler

Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 05.10.2005, 10:55 Titel: |
|
|
Naja, mit dem PerformanceCounter klappts nun flüssig.  _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|