Frame Limiter

Started by
6 comments, last by Smack0007 23 years, 7 months ago
How do you limit the frames your program outputs so that the way the game looks on one machine is the same on another? Do you simply limit the input scans or do you auctally make it where the program can only push x amount of frames per second? zac@qisfl.net
Snowsoft Online
I don't pretend to know anything.
- I don't pretend to know anything.Snowsoft
Advertisement
a common method to limit frames is to install a timer and regulate the frames based off of the timer. but if you just want the program to run the same speed on every computer I would recomend frame based modeling. this is basically where you time how long it takes to draw the scene and use this time (delta) to base how much to move the objects. like this:
time1=timeGetTime();
drawscene();
time2=timeGetGime();
delta=time2-time2;
obj+=0.1f*delta;

JoeMont001@aol.com www.polarisoft.n3.net
My HomepageSome shoot to kill, others shoot to mame. I say clear the chamber and let the lord decide. - Reno 911
The QueryPerformanceCounter function can do the same only at higher resolution. Call QueryPerformanceFrequency to get the frequency.
ya, also QueeryPerformanceCounter is a lot more accurate than timeGetTime(). QPC returns microseconds, so you''ll have to convert to milliseconds, not too tough.

JoeMont001@aol.com www.polarisoft.n3.net
My HomepageSome shoot to kill, others shoot to mame. I say clear the chamber and let the lord decide. - Reno 911
QueryPerformanceCounter *does not* return time in microseconds or any other predictable unit. It just returns the value of a counter. Use QueryPerformanceFrequency to get the counts per second as BitMaster pointed out.
quote:
QueryPerformanceCounter *does not* return time in microseconds

are you sure? I''ve heard otherwise from someone who used it as his timer for his 3d engine. and it works.

JoeMont001@aol.com www.polarisoft.n3.net
My HomepageSome shoot to kill, others shoot to mame. I say clear the chamber and let the lord decide. - Reno 911
I am using this FrameRate-limiter in my small games:

DWORD LastTime;const DWORD Speed_Value = 50; // The higher, the slowerwhile (1) //Main loop{    LastTime = timeGetTime ();    GameStuff ();    while (timeGetTime () < LastTime + Speed_Value)    {        // Do something useful    }} 


Works fine

- - - - - - - - - - - - - -
Andreas Mähler
Wolf359 Interactive
All good advise but you''ll get in to trouble with all of them. You said that you wanted to use this to sync different pcs.

Be very carful about this. THink about how this would work. Just say you have 32 players connected. What happens if one players has a peice of shit for a PC and can''t maintain the frame rate? Or if a big battle ensue''s? or .. etc...

Take a slightly different tact. Seperate you frame rate from the input event system.

Think about this. Only sample your mouse/keyboard at a certain rate. For example 50 ms. Then let your frame rate run at whatever it wants to(either locked or open like quake, whatever you want). The at each 50ms interval you grab the movements, act on them and send off the network packets. This way if you hit a slow pocket because everyone piles in to one room your movement\network layer in unaffected by the slowdown, ditto with diferent speeded pc''s.

(This is a very basic example. Once you get it, think about running the network\input in a different thread with a timing delay loop. Also think about using input events, like DirectX''s buffered input or SDL''s events. That way no matter what interval you pick you always get ALL keypresses.)

HTH

gimp

(oh, and for info on QueryPerformaceCounter check the general programming forum. I gets ansered about evey week. Also check flipcode "Code of the day for some nice classes")
Chris Brodie

This topic is closed to new replies.

Advertisement