Sign in to follow this  

[SDL] FPS is extremely high

This topic is 3593 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

When I start the application it has an FPS of 1,000,000,000 It keeps going down every second, and finnaly hangs around 10,000,000-20,000,000! The only thing I draw is an SDL surface and some input checking, the FPS count works like this:
int frames, fps, update;
fps = SDL_GetTicks();
update = SDL_GetTicks();

bool done = false;
while (!done) // the main loop, every loop redraws the scene
{
    // input checking and scene drawing
    if ((SDL_GetTicks() - update) > 1000)
    {
        stringstream caption;
        caption << frames / ((SDL_GetTicks() - fps) / 1000);
        SDL_WM_SetCaption(caption.str().c_str(), NULL);
        update = SDL_GetTicks();
    }
    frames++;

    SDL_Delay(10);
}
Is that normal? Because when I had less functionality the FPS was lower (around 10,000, and when I started the project it was ~80 (perhaps I did a lot of time consuming stuff at that stage that weren't needed though)). I even use the delay function, which is to keep the CPU usage low. PS: it keeps falling, after a few minuts its at 5,000,000

Share this post


Link to post
Share on other sites
You are calculating it wrong. Here is how I would do that:


int frames=0, update;
float fps;
update = SDL_GetTicks();

bool done = false;
while (!done) // the main loop, every loop redraws the scene
{
// input checking and scene drawing
if ((SDL_GetTicks() - update) > 1000)
{
stringstream caption;
fps = frames / (SDL_GetTicks()-update) * 1000;
caption << fps;
SDL_WM_SetCaption(caption.str().c_str(), NULL);
update = SDL_GetTicks();
frames = 0;
}
frames++;

SDL_Delay(10);
}

Share this post


Link to post
Share on other sites
And you also should use floats to calculate the fps! Even though fps is a float in fps = frames / (SDL_GetTicks()-update) * 1000; the calculation is not done with floats since frames and the SDL_GetTicks()... are both ints. You have to cast at leat one of them to float.

Share this post


Link to post
Share on other sites
Try this:

header file:

#ifndef class_fps_counter_h
#define class_fps_counter_h 1
#include <SDL/SDL.h>
class fps_counter{
private:
unsigned int app_ticks;//total ticks so far in this app
int frame_cap; //limit FPS to this
bool cap_frames; //do we need to?
float last_fps;
float last_timeslice;
public:
fps_counter();

void set_cap(int fps);
void cap_on();
void cap_off();
void tick();

float get_fps(){return last_fps;};
float get_timeslice(){return last_timeslice;};

};
#endif



source file:

/*
* fps_counter.cpp
* worms
*
* Created by Gavin Burton on 27/11/2007.
* Copyright 2007 __MyCompanyName__. All rights reserved.
*
*/


#include "fps_counter.h"

fps_counter::fps_counter()
{
frame_cap = 60;
cap_off();
last_fps=0;
last_timeslice=1;
};

void fps_counter::tick()
{
float fps;
float total_ticks,last_ticks;
do{
total_ticks = SDL_GetTicks();
last_ticks = total_ticks - app_ticks;
fps = 1000.0 / last_ticks;

}while ( fps > 1000 || ((fps > frame_cap) && cap_frames));

app_ticks = total_ticks;
last_fps = fps;
last_timeslice = 1.0f / fps;
//printf("Timer updated, last_fps= %f , last_timeslice=%f\n",last_fps,last_timeslice);
};

void fps_counter::set_cap(int cap)
{
frame_cap = cap;
};

void fps_counter::cap_off()
{
cap_frames = false;
};

void fps_counter::cap_on()
{
cap_frames = true;
};



I have several subsystems running at different framerates using this class.

Share this post


Link to post
Share on other sites
Use it thusly:




#include "fps_counter.h"

fps_counter * counter = new fps_counter();

while(we_don't_want_to_exit){
counter.tick();
float fps = counter.get_fps();
printf("We know that oop is running at %d fps by measuring time between calls of tick()\n");
}





To measure the time between ticks. I have each subsystem use one of these, and accumilate the results of get_timeslice until its time to update, then fire off an event of some kind. (e.g. sprites updating at 15fps, physics running at 60, character animations running at 30, etc.)

I don't know why I called it an FPS counter, but its not really a timer (no callbacks) and its not limited to FPS it also does the timeslice.

Share this post


Link to post
Share on other sites

This topic is 3593 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this