SDL_gfx has a framerate manager that does stuff like that …
http://www.ferzkopp.net/joomla/content/view/19/14/
—snip—
The framerate functions are used to insert delays into the graphics loop
to maintain a constant framerate.
The implementation is more sophisticated that the usual
SDL_Delay(1000/FPS);
call since these functions keep track of the desired game time per frame
for a linearly interpolated sequence of future timing points of each
frame. This is done to avoid rounding errors from the inherent
instability in the delay generation and application - i.e. the 100th
frame of a game running at 50Hz will be accurately 2.00sec after the 1st
frame (if the machine can keep up with the drawing). See also the
diagram for more details on this.
[[[ Interface ]]]
The functions return 0 or value for sucess and -1 for error. All functions
use a pointer to a framerate-manager variable to operate.
void SDL_initFramerate(FPSmanager * manager);
Initialize the framerate manager, set default framerate of 30Hz and
reset delay interpolation.
int SDL_setFramerate(FPSmanager * manager, int rate);
Set a new framerate for the manager and reset delay interpolation.
int SDL_getFramerate(FPSmanager * manager);
Get the currently set framerate of the manager.
void SDL_framerateDelay(FPSmanager * manager);
Generate a delay to accommodate currently set framerate. Call once in the
graphics/rendering loop. If the computer cannot keep up with the rate
(i.e.
drawing too slow), the delay is zero and the delay interpolation is reset.
L-28C wrote:> Hello everyone!
I’m translating a piece of code into C#. However it has some variables
and functions that who-knows-where they are declared, so if anyone could
analyze my framerate function I would appreciate it: (translated back to
C++ and regular SDL 'cause I know most of you guys don’t speak C#)
void waitVblankStart()
{
float t = ((float) SDL_GetTicks()) / ((float) 60);
if (t - lastTime < 1.0/60.0)
{
SDL_Delay(int)(1000000000.0 * (1.0 / 60.0 - (t - lastTime))));
}
// lastTime is a global, and 2,000,000 stands for 2.0GHz How do I get
the actual processor cycles-per-second in SDL?
lastTime = ((float) SdlDotNet.Core.Timer.TicksElapsed) / ((float) 2000000);
printf(lastTime); // assume printf() can print floats
}
Thanks in advance!
SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org