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?
Game loop example for Windows
Started by Headkaze, Feb 19 2012 07:52 AM
5 replies to this topic
Ad:
#2 Members - Reputation: 282
Posted 19 February 2012 - 09:54 AM
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 );
};
Halfway down the trail to Hell...
#3 Moderators - Reputation: 2181
Posted 19 February 2012 - 10:02 AM
Headkaze, on 19 February 2012 - 07:52 AM, said:
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.
#4 Members - Reputation: 184
Posted 19 February 2012 - 10:08 AM
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.
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
http://www.ultimategamedevelopment.com - My game development DVD tutorials. Learn to make complete 2D/3D games step by step.
http://www.youtube.c...ev?feature=mhee - Follow my video blog on making a 3D flight sim game.
http://www.youtube.c...ev?feature=mhee - Follow my video blog on making a 3D flight sim game.
#5 Members - Reputation: 107
Posted 20 February 2012 - 07:48 PM
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);
}
#6 Members - Reputation: 694
Posted 21 February 2012 - 07:13 AM
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.
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.
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);


















