Jump to content

  • Log In with Google      Sign In   
  • Create Account


SFML Frame Per Second feedback


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 0026sd   Members   -  Reputation: 132

Like
0Likes
Like

Posted 31 October 2012 - 07:38 AM

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:

Main.cpp
[source lang="cpp"]#include <SFML/Graphics.hpp>#include <iostream>#include "FPS.h"#define ScreenWidth 500#define ScreenHeight 300int 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]

FPS.h
[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]
FPS.cpp
[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]

Sponsor:

#2 rip-off   Moderators   -  Reputation: 8112

Like
1Likes
Like

Posted 31 October 2012 - 10:08 AM

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

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:
  • SetFramerateLimit - does reducing this value to 60 change anything?
  • Have you tried UseVerticalSync()?

Edited by rip-off, 31 October 2012 - 10:10 AM.


#3 0026sd   Members   -  Reputation: 132

Like
0Likes
Like

Posted 31 October 2012 - 10:18 AM


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

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:
  • SetFramerateLimit - does reducing this value to 60 change anything?
  • Have you tried UseVerticalSync()?


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.

#4 BeerNutts   Crossbones+   -  Reputation: 2793

Like
0Likes
Like

Posted 31 October 2012 - 11:06 AM



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

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:
  • SetFramerateLimit - does reducing this value to 60 change anything?
  • Have you tried UseVerticalSync()?


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.


What is the cpu % if you don't make the FPS call in your loop?
My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

#5 0026sd   Members   -  Reputation: 132

Like
0Likes
Like

Posted 31 October 2012 - 11:12 AM

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


I believe it's around 3% or so..

Edited by 0026sd, 31 October 2012 - 11:13 AM.


#6 astagg   Members   -  Reputation: 277

Like
1Likes
Like

Posted 01 November 2012 - 02:59 AM

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 didn't think 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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS