Jump to content



Game loop example for Windows

  • You cannot reply to this topic
5 replies to this topic

#1 Headkaze   Members   -  Reputation: 422

Like
0Likes
Like

Posted 19 February 2012 - 07:52 AM

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?

Ad:

#2 Scourage   Members   -  Reputation: 282

Like
0Likes
Like

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 phantom   Moderators   -  Reputation: 2181

Like
0Likes
Like

Posted 19 February 2012 - 10:02 AM

View PostHeadkaze, 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 dpadam450   Members   -  Reputation: 184

Like
0Likes
Like

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.
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.

#5 TraxMate   Members   -  Reputation: 107

Like
0Likes
Like

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 V-man   Members   -  Reputation: 694

Like
0Likes
Like

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






We are working on generating results for this topic
PARTNERS