Jump to content
  • Advertisement
Sign in to follow this  
Headkaze

OpenGL Game loop example for Windows

This topic is 2338 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
Advertisement
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:



#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 );
};

Share this post


Link to post
Share on other sites

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?


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
http://steinsoft.net...pets/OpenGL/no7

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.

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

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!

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);
}

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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!