Sign in to follow this  
Headkaze

OpenGL Game loop example for Windows

Recommended Posts

I am looking for an OpenGL game loop example for Windows. All the ones I've seen are while loops and a message pump which tends to use alot of CPU even for something simple. In OSX we have CVDisplayLinkSetOutputCallback which is a VSync callback. Is there anything like it for Windows? Does anyone have a good example?

Share this post


Link to post
Share on other sites
Why don't you use something that abstracts that all away like GLFW. Its lightweight, fast, and cross platform, so your code will work on both a mac and windows (even linux too!). Then your game loop simply becomes:

[code]

#include <GL/glfw.h>
#include <stdlib.h>

int main( void )
{
int running = GL_TRUE;
// Initialize GLFW
if( !glfwInit() )
{
exit( EXIT_FAILURE );
}

// Open an OpenGL window
if( !glfwOpenWindow( 800,600, 8,8,8,8,24,8, GLFW_WINDOW ) )
{
glfwTerminate();
exit( EXIT_FAILURE );
}

// Main loop
while( running )
{
// OpenGL rendering goes here...
glClear( GL_COLOR_BUFFER_BIT );

//call your game code
doSomethingAwesome();
render();

// Swap front and back rendering buffers
glfwSwapBuffers();

// Check if ESC key was pressed or window was closed
running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED );
}

// Close window and terminate GLFW
glfwTerminate();

// Exit program
exit( EXIT_SUCCESS );
};

[/code]

Share this post


Link to post
Share on other sites
[quote name='Headkaze' timestamp='1329659521' post='4914494']
I am looking for an OpenGL game loop example for Windows. All the ones I've seen are while loops and a message pump which tends to use alot of CPU even for something simple. In OSX we have CVDisplayLinkSetOutputCallback which is a VSync callback. Is there anything like it for Windows? Does anyone have a good example?
[/quote]

If v-sync is enabled then the front/back buffer swap will block until the next vsync on windows.
If you are seeing no blocking then v-sync is disabled, likely set to 'off unless application says otherwise' in the driver control panel, and needs to be switched on. You can either change this setting in the control panel or use the swap control extension to try to enable it for your app.

Share this post


Link to post
Share on other sites
[url="http://steinsoft.net/index.php?site=Programming/Code%20Snippets/OpenGL/no7"]http://steinsoft.net...pets/OpenGL/no7[/url]

One thing I do, is because I want my game to take 100% cpu because I want it to run as fast as possible is:

If window is not the front most window, slow it down for my other applications.
[code]
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
/* handle or dispatch messages */
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
else
//Don't do anything if the window isnt in focus
if(GetFocus() == NULL)
{
Sleep(50);
}
else
{
//Main Game Loop[/code]

Share this post


Link to post
Share on other sites
This is how my game loop looks like. It's a separate thread created after the GL context has been created. This way I can use GetMessage() instead and VSync wont create a huge input lag since the rendering are separate from the input!

[code]void GameLoop()
{
Window.MakeCurrent();

while(!Window.Quit)
{
float StartFrame = Timer.GetElapsedSeconds();

if(Window.Resize)
{
Window.Resize = false;
Resize(Window.GetClientWidth(), Window.GetClientHeight());
}

Input.ProcessInput();
Window.RenderFrame();

g_FrameTime = Timer.GetElapsedSeconds() - StartFrame;
}

Window.DestroyCurrent();
ExitThread(0);
}[/code]

Share this post


Link to post
Share on other sites
Game's are suppose to use up all the CPU time.
Applications (like CAD) are coded slightly differently and do an update on a WM_PAINT message.

You can of course use sleep() to put your thread to sleep for a set amount of milliseconds. That will reduce CPU usage.

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