SFML community forums

Help => Window => Topic started by: Jove on April 28, 2012, 09:38:55 pm

Title: Unusual CPU readings relating to vertical sync/frame rate limit [solved]
Post by: Jove on April 28, 2012, 09:38:55 pm
Wow!  Two posts in one day, that must be a record!

Today I've been learning a little about Vertex Arrays and in my testing I came across something I've noticed before, but narrowed it down to a minimal example so I can ask what it's all about (it has nothing to do with Vertex Arrays though).

Here's some code:

#include <SFML\Graphics.hpp>
#include "Random.h"

int main()
{
    sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "SFML");

        App.EnableVerticalSync(true);
        //App.SetFramerateLimit(60);

        const unsigned int NOOF_DOTS = 128;

        sf::VertexArray dots(sf::Quads, NOOF_DOTS * 4);

        for (int i=0; i<NOOF_DOTS*4; i+=4)
        {
                Random gen;

                float x = gen.randomF(0,1024);
                float y = gen.randomF(0,768);

                dots[i]  .Position = sf::Vector2f( x,   y   );
                dots[i+1].Position = sf::Vector2f( x,   y+2 );
                dots[i+2].Position = sf::Vector2f( x+2, y+2 );
                dots[i+3].Position = sf::Vector2f( x+2, y   );
        }

        while (App.IsOpen())
        {
                sf::Event Event;
                while (App.PollEvent(Event))
                {
                        if (Event.Type == sf::Event::Closed)
                                App.Close();
                }

                App.Clear();
                App.Draw (dots);
                App.Display();
        }

        return EXIT_SUCCESS;
}

NOTE 1: The 'Random' thing is just a little class I made to replace the old 1.6 Randomizer, it isn't really necessary.
NOTE 2: Running SFML2 from the Release .exe
NOTE 3: The snapshot I'm using is one just prior to the naming convention change.

The purpose of this test is simply to throw lots of tiny squares on the screen as a prelude to using this new aspect of SFML2 in a particle system I'm planning to re-create.

I noticed however (something I've seen before), some odd readings from the CPU.

(http://www.jestofevekites.com/markc/sfmlcpu.png)

With Vsync enabled and running 128 dots, CPU is low.
Change up by one to 129 dots and it leaps up to 25%. ???

Removing Vsync and using just frame limiting at 60, I can nearly white-out the screen with thousands of dots and the CPU appears to be yawning at 0%!  Naturally, I'd prefer the VSync for smoothness, but I find this behaviour a little strange and it has confused me for some time now.

What exactly is it here that I'm not understanding correctly?

*Edit - changed title for future searches
Title: Re: Unusual CPU readings relating to Vsync/rateLimit
Post by: Laurent on April 28, 2012, 10:38:33 pm
I'm afraid there's no clear explanation to this behaviour. Sometimes it's hard to figure out what happens inside the graphics driver.
Title: Re: Unusual CPU readings relating to Vsync/rateLimit
Post by: Jove on April 28, 2012, 11:54:53 pm
Interesting.  ISTR John Carmack saying nasty things about PC video drivers.

It would be nice if someone with an ATI/AMD card was to try this and see if the same thing happens.

I guess I should just ignore it, although it makes code testing a little ambiguous.
Title: Re: Unusual CPU readings relating to Vsync/rateLimit
Post by: dobbi10k on April 29, 2012, 11:09:36 am
I'm using an AMD Radeon HD 6970 and I don't have those issues, neither with V-Sync nor a frame rate limit. My CPU (i5 25010K) stays at 0% until I have let's say 100k dots drawn...

I also updated your code to comply with the new SFML2 camelCase:
#include <SFML\Graphics.hpp>

int main()
{
    sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "SFML");

        App.setVerticalSyncEnabled(true);
        //App.setFramerateLimit(60);

        const unsigned int NOOF_DOTS = 100000;

        sf::VertexArray dots(sf::Quads, NOOF_DOTS * 4);

        for (int i=0; i<NOOF_DOTS*4; i+=4)
        {
                float x = rand() % 1024;
                float y = rand() % 768;

                dots[i]  .position = sf::Vector2f( x,   y   );
                dots[i+1].position = sf::Vector2f( x,   y+2 );
                dots[i+2].position = sf::Vector2f( x+2, y+2 );
                dots[i+3].position = sf::Vector2f( x+2, y   );
        }

        while (App.isOpen())
        {
                sf::Event Event;
                while (App.pollEvent(Event))
                {
                        if (Event.type == sf::Event::Closed)
                                App.close();
                }

                App.clear();
                App.draw (dots);
                App.display();
        }

        return EXIT_SUCCESS;
}
Title: Re: Unusual CPU readings relating to Vsync/rateLimit
Post by: Jove on April 29, 2012, 03:20:45 pm
Thanks for testing it, Dobbi.  :)

This is the second Nvidia card I have owned that does this strange thing, so I suppose it really does boil down to drivers.
Title: Re: Unusual CPU readings relating to vertical sync/frame rate limit [solved]
Post by: Jove on April 29, 2012, 06:17:52 pm
[SOLVED]...(sort of)

I found an option in the Nvidia control panel - Threaded Optimisation.  Auto by default, switching it off seems to have helped a lot.