Sign in to follow this  
TheSteve

OpenGL Sustained frame rates

Recommended Posts

TheSteve    136
It's been a while since I've seen something like this, but with the advent of the new xbox I got reminded of an old SGI adage that stated "Sustained 60 is better than variable 300." The commment was in regard to framerates and how the best thing to do was to always maintain a framerate vs. varying it. The real question is if there's an easy way to do that with OpenGL? I know on my old Octane everything seemed to just default to that, but I never looked into how to code it. Thoughts?

Share this post


Link to post
Share on other sites
DrewGreen    370
The default framerate you were seeing was probably due to the refresh rate you set for your monitor (unless you'd disabled vsync).

There are two possibilities I can think of - the first is to make your program framerate independant to a certain extent by linking your scene updates with time - see this NeHe tutorial.

Alternatively, you could try to maintain a particular framerate by skipping the "drawing part" of a frame when things get too slow. Updates to the game world data should still happen for this frame, but nothing gets drawn at the end of it.

This is kind of similar to the first option, except you are attacking the problem from the opposite viewpoint (that things will take longer to update than required for a given framerate rather than things being too fast).

I think in most cases doing the first option will suffice (and I would highly recommend it as the result is smooth movement - framerate only really becomes an issue when things appear jerky & become too unpredictable for the player to react properly), but you could use both together to account for all possibilities.
As an aside, this is not something that is specific to OpenGL, the basic principles apply to any API or game.

Share this post


Link to post
Share on other sites
frob    44920
Quote:
Original post by TheSteve
It's been a while since I've seen something like this, but with the advent of the new xbox I got reminded of an old SGI adage that stated "Sustained 60 is better than variable 300." The commment was in regard to framerates and how the best thing to do was to always maintain a framerate vs. varying it. The real question is if there's an easy way to do that with OpenGL? I know on my old Octane everything seemed to just default to that, but I never looked into how to code it. Thoughts?

Depends on the situation, and what they are describing.


They might be referring to the number of frames per second with frames being divided up nearly equally over time. Your physics and AI should operate at a fixed rate. That was not always true of graphics systems, nor is it true of many non-professional games.

These days a good design separates the display from everything else, so that's not a problem.

As long as the 'variable' display is divided equally over time, then it's fine to render as fast as possible up to the refresh rate of the screen. Interpolate the display based on the time between the two physics steps and you'll be fine.



If they're referring to variable display as not divided equally over time, then they are correct. A worst-case example for variable 300 FPS display time is that one frame takes 0.999 seconds, then the remaining 299 frames are generated in the remaining 0.001 seconds. That's a BAD situation, but less extreme versions usually happen.

That situtaion is the reason you should be measuring the time of frames,rather than FPS. Your in-game benchmarks should have the average, min, and max over a given time frame. If your min and max get too far apart, you've got a problem.


frob.

Share this post


Link to post
Share on other sites
TheSteve    136
Well, the framerate definetly wasn't based on the monitor. Almost all SGI programs on all different monitors ran at 60 fps, even if you had the lastest monitor and an incredible Onyx 2 (which was the bomb at the time). As far as it being variable with time, I'm not sure about that. All I know is that the big thing back in the 1995-1999 glory days of SGI was that they always maintained a 60fps sustained rate and nothing more/less. Their argument, which I believe is true from watching the xbox, is that anything variable is going to ultimately look worse than sustained. You can even see this in action to this day if you go and look at an xbox 360 running one of their new games. At 30 fps, it looks damn amazing. Not just in terms of "nice graphics," but in terms of overall smoothness and consistency. I think there's a more aggressive and perhaps a great deal more complicated way to do it. Hopefuly there's a big IRIX buff on this forum.

Share this post


Link to post
Share on other sites
RichardS    298
The general premise is entirely true. Constant 30fps 'feels' much smoother than a program that runs at a mean of 45fps, but has a high std deviation (> 5-8 perhaps?).

There isn't any point in rendering at 300fps. While it may make the owner of a 7800 GTX feel good, I think you're burning my laptop's battery down.

I disagree with most people at gamedev, in that I prefer to use Vsync. It keeps the framerate very consistant, while keeping resource usage down. But my programs are multithreaded, and use lots of background CPU time (on-the-fly resource loading for visualizing multi-terabyte data sets). The extra CPU freed up when the rendering thread sleeps (during a blocked buffer swap) makes a huge difference on single processor machines.

Share this post


Link to post
Share on other sites

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  

  • Similar Content

    • By povilaslt2
      Hello. I'm Programmer who is in search of 2D game project who preferably uses OpenGL and C++. You can see my projects in GitHub. Project genre doesn't matter (except MMO's :D).
    • By ZeldaFan555
      Hello, My name is Matt. I am a programmer. I mostly use Java, but can use C++ and various other languages. I'm looking for someone to partner up with for random projects, preferably using OpenGL, though I'd be open to just about anything. If you're interested you can contact me on Skype or on here, thank you!
      Skype: Mangodoor408
    • By tyhender
      Hello, my name is Mark. I'm hobby programmer. 
      So recently,I thought that it's good idea to find people to create a full 3D engine. I'm looking for people experienced in scripting 3D shaders and implementing physics into engine(game)(we are going to use the React physics engine). 
      And,ye,no money =D I'm just looking for hobbyists that will be proud of their work. If engine(or game) will have financial succes,well,then maybe =D
      Sorry for late replies.
      I mostly give more information when people PM me,but this post is REALLY short,even for me =D
      So here's few more points:
      Engine will use openGL and SDL for graphics. It will use React3D physics library for physics simulation. Engine(most probably,atleast for the first part) won't have graphical fron-end,it will be a framework . I think final engine should be enough to set up an FPS in a couple of minutes. A bit about my self:
      I've been programming for 7 years total. I learned very slowly it as "secondary interesting thing" for like 3 years, but then began to script more seriously.  My primary language is C++,which we are going to use for the engine. Yes,I did 3D graphics with physics simulation before. No, my portfolio isn't very impressive. I'm working on that No,I wasn't employed officially. If anybody need to know more PM me. 
       
    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
  • Popular Now