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 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]
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]
SFML Frame Per Second feedback
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:
- SetFramerateLimit - does reducing this value to 60 change anything?
- Have you tried UseVerticalSync()?
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()?
[/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 name='rip-off' timestamp='1351699688' post='4995852']
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()?
[/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?
What is the cpu % if you don't make the FPS call in your loop?
I believe it's around 3% or so..
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.
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.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement