GetTickCount()...

rook

Erfahrenes Mitglied
hab ne kleine frage... ich programmier grad ne 3d engine.. mir is aufgefallen, wenn ich mich bewege.. das die wände dann an mir vorbei "zuckeln" und sich nicht flüssig bewegen... das liegt wohl an meinem "frame rate begrenzer"(nich wirklich einer, aba sowas in der art).. der sieht in etwa so aus...

Code:
void Update(DWORD ms)
{
	move_speed = SPEED * ms;
}

void main(void)
{
	DWORD tick, lasttick = GetTickCount();
	
	while(true)
	{
		tick = GetTickCount();
		Update(lasttick - tick);
		DrawFrame(); // bla bla usw...
		lasttick = GetTickCount();
	}
}

wenn ich den "frame rate begrenzer" weg lass.... bewegt sich alles total flüssig... aber ich muss ihn ja einbaun.. das die engine auf jedem comp gleich schnell fuzzt...

nu hab ich ma geschaut was mir GetTickCount() zurückgibt....
sagen wir mal... 1000
so... jez ruf ich GetTickCount() 1 frame später auf... hab ich immer noch 1000
... noch ein frame später..... 1000....
ein paar frames später... ~1016...
warum is das so?
deswegen zuckelt das au so... wenn er also 1000 - 1000 rechnet haben wir 0 raus... und SPEED mit 0 multipliziert ergibt 0... kein wunder das es also zuckelt... wenn er mal 0 und mal 16 raus hat.... bei mir bewegt sich das immer im rahmen... 0, 15, 16, 32... sonst nix...

und nun meine eigentliche frage *g*
wie bekomm ich einen genaueren wert raus? wirklich auf die millisekunde genau...?!
 
moin


lasttick ist doch immer kleiner als tick, sodas du dort immer negative Werte herausbekommen müsstest?!


mfg
umbrasaxum
 
Hallo,

du hast einen Denkfehler in deiner Schleife.
In lasttick wird die Zeit seit dem Systemstart gespeichert ( ms ),
direkt darauf wird die neue Zeit in tick gespeichert und dann wird gerechnet.
-> lasttick ist wie umbrasaxum schreibt immer kleiner als tick ;-)

Code:
	while(true)
	{
		tick = GetTickCount();
		DrawFrame();
                Update(GetTickCount() - tick);
	}

Auf diese Weiße läuft deine Engine auch noch schneller, :) denn es wird keine unnötige Zuweißung gemacht. Außerdem sparst du dir eine Variable.

Noch ein Tipp:

Wenn du an einer 3d engine arbeitest, zeichne erst und führe danach die neuen Berechnungen durch. So arbeiten Prozessor und Grafikprozessor besser zusammen, da der Prozessor nicht auf den Grafikprozessor warten muss. :p
 
................ :P
mag sein das ich mich verschriebn hab... da ich das nich aus meiner engine kopiert hab... sondern einfach mal fix eingetippt hab... aba das mein ich garnich.... kompiliert mal diesen code:

Code:
void main(void)
{
	for(int i = 0; i < 256; i++)
		printf("%d\n", GetTickCount());
}

und siehe da:
Code:
...
1506884671
1506884671
1506884671
1506884671
1506884671
1506884671
1506884671
1506884671
1506884687
1506884687
1506884687
1506884687
1506884687
1506884687
1506884687
1506884687
...

+16..... :/

#edit:
trotzdem thx für eure antworten... un noch ne frage, warum is lasttick immer kleiner?
tick = Get...
lasttick = Get...

#edit2:
lol zum totlachen :)
wie peinlich :P *rotwerd*
ja ich habs gesehn... aba das macht nix, wie gesagt is nich aus meiner engine...
 
Zuletzt bearbeitet:
Wer lesen kann, ist klar im Vorteil:
http://msdn.microsoft.com/library/en-us/sysinfo/base/gettickcount.asp hat gesagt.:
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.

[...]

If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.

Normalerweise wird in einem solchen Fall QueryPerformanceCounter() eingesetzt.
 
Die Systemzeit wird nur alle ca. 10 -13 ms upgedatet, deshalb bekommst du
bei GetTickCount bei mehrmaligen Aufruf in kurzer Zeit immer den selben Wert...

Ich habe für mich bis dato keine Lösung. Mein Chef hat mal irgendwas mit
Multimedia Timern gemacht, auch irgendein Element vom SDK, mit dem
kriegt man entscheidend genauere Auflösungen hin. Aber frag mich bitte nicht
wie das geht, da müßte ich, wie du, auch erst mal in der MSDN nachforschen..

BadMourning
 
Zurück