Sign in to follow this  

SFML Frame Per Second feedback

This topic is 1902 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

Hi everyone,

I wanted to add an FPS visual in my game so I converted a script I saw in the XNA 3.0 book to SFML. I'm bascially just wondering if there's any way to optimize the performance as it sometimes eats up more CPU than I would have thought it should. Here's the code:

[b]Main.cpp[/b]
[source lang="cpp"]#include <SFML/Graphics.hpp>
#include <iostream>
#include "FPS.h"

#define ScreenWidth 500
#define ScreenHeight 300

int main()
{

sf::RenderWindow window(sf::VideoMode(ScreenWidth, ScreenHeight, 32), "SFML Template");
window.SetFramerateLimit(200);

FPS fps;
fps.Initialize();

while(window.IsOpened())
{

sf::Event Event;
while(window.GetEvent(Event))
{
if(Event.Type == sf::Event::Closed || Event.Key.Code == sf::Key::Escape)
window.Close();
}

window.Clear();

// Draw Game Components
fps.Draw(window, (ScreenWidth / 2) - 25);

window.Display();

}

return 0;

}[/source]

[b]FPS.h[/b]
[source lang="cpp"]#pragma once
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>

class FPS
{
private:
float fps;
float updateInterval;
float timeSinceLastUpdate;
float frameCount;

sf::String string;
std::stringstream ss;

public:
FPS(void);
~FPS(void);

void Initialize();
void Update(sf::RenderWindow &window);
void Draw(sf::RenderWindow &window, float cameraX);

};
[/source]
[b]FPS.cpp[/b]
[source lang="cpp"]#include "FPS.h"

FPS::FPS(void)
{
}

FPS::~FPS(void)
{
}

void FPS::Initialize()
{

float updateInterval = 1.0f;
float timeSinceLastUpdate = 0.0f;
float frameCount = 0.0f;
string.SetSize(12);
string.SetColor(sf::Color::White);

}

void FPS::Update(sf::RenderWindow &window)
{
}

void FPS::Draw(sf::RenderWindow &window, float cameraX)
{

frameCount++;
timeSinceLastUpdate = window.GetFrameTime();

if(timeSinceLastUpdate > updateInterval){

fps = frameCount / timeSinceLastUpdate;

ss << "FPS: " << fps;
string.SetText(ss.str());
string.SetPosition(cameraX, 20);

window.Draw(string);

ss.str("");
frameCount = 0;
timeSinceLastUpdate -= updateInterval;

}

}
[/source]

Share this post


Link to post
Share on other sites
[quote]
I'm bascially just wondering if there's any way to optimize the performance as it sometimes eats up more CPU than I would have thought it should
[/quote]
What amount of CPU usage were you expecting, and why? Generally, it is a good thing that no one tries to pre-emptively throttle your program - that way when you need to use the maximum available system resources you can (more or less). The OS is usually happy for your game to soak up any remaining CPU time. If your game knows that it doesn't need to use all the CPU, it can tell the OS this by issuing blocking calls.

I'm not overly familar with SFML, but some places to start include:
[list]
[*] SetFramerateLimit - does reducing this value to 60 change anything?
[*] Have you tried UseVerticalSync()?
[/list] Edited by rip-off

Share this post


Link to post
Share on other sites
[quote name='rip-off' timestamp='1351699688' post='4995852']
[quote]
I'm bascially just wondering if there's any way to optimize the performance as it sometimes eats up more CPU than I would have thought it should
[/quote]
What amount of CPU usage were you expecting, and why? Generally, it is a good thing that no one tries to pre-emptively throttle your program - that way when you need to use the maximum available system resources you can (more or less). The OS is usually happy for your game to soak up any remaining CPU time. If your game knows that it doesn't need to use all the CPU, it can tell the OS this by issuing blocking calls.

I'm not overly familar with SFML, but some places to start include:
[list]
[*]SetFramerateLimit - does reducing this value to 60 change anything?
[*]Have you tried UseVerticalSync()?
[/list]
[/quote]

Reducing the value to 60 doesn't change much in terms of CPU usage and I have used vertical sync with the same result.

The amount of CPU it's using is a similar amount to the amount that World of Warcraft runs on the same computer!! My CPU meter basically goes from 0% to 12-17%.

Anyway, if it's not something to worry too much about then I won't. I'm still new to low level programming and am trying to learn best practices.

thanks for you feedback.

Share this post


Link to post
Share on other sites
[quote name='0026sd' timestamp='1351700315' post='4995858']
[quote name='rip-off' timestamp='1351699688' post='4995852']
[quote]
I'm bascially just wondering if there's any way to optimize the performance as it sometimes eats up more CPU than I would have thought it should
[/quote]
What amount of CPU usage were you expecting, and why? Generally, it is a good thing that no one tries to pre-emptively throttle your program - that way when you need to use the maximum available system resources you can (more or less). The OS is usually happy for your game to soak up any remaining CPU time. If your game knows that it doesn't need to use all the CPU, it can tell the OS this by issuing blocking calls.

I'm not overly familar with SFML, but some places to start include:[list]
[*]SetFramerateLimit - does reducing this value to 60 change anything?
[*]Have you tried UseVerticalSync()?
[/list]
[/quote]

Reducing the value to 60 doesn't change much in terms of CPU usage and I have used vertical sync with the same result.

The amount of CPU it's using is a similar amount to the amount that World of Warcraft runs on the same computer!! My CPU meter basically goes from 0% to 12-17%.

Anyway, if it's not something to worry too much about then I won't. I'm still new to low level programming and am trying to learn best practices.

thanks for you feedback.
[/quote]

What is the cpu % if you don't make the FPS call in your loop?

Share this post


Link to post
Share on other sites
[quote name='BeerNutts' timestamp='1351703200' post='4995879']


What is the cpu % if you don't make the FPS call in your loop?
[/quote]

I believe it's around 3% or so.. Edited by 0026sd

Share this post


Link to post
Share on other sites
Just starting out with sfml myself and learning my way around it. I should point out that the GetFrameTime() function has been removed in the new version (2.0) as they [url="http://en.sfml-dev.org/forums/index.php?topic=6831.0"]didn't think[/url] it was accurate or needed. It is recommended that you use the clock class, most common way would be to get the time since the last call within the main loop and pass this to any functions that would need to know it.

I would also personally assess the performance of the function of the time that you are spending within it rather than CPU %. You can do this again with the clock class, reset it at the beginning of your draw function and then get the time at the end to see how long you spent there. You can then decide from this if you are spending too long in this function.

Share this post


Link to post
Share on other sites

This topic is 1902 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