Advertisement Jump to content
Sign in to follow this  

Keypress is lagging

This topic is 5057 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

2 buttons move a triangle back and forth. The triangle is rotating and is constantly updating. There is some lag when I push a button and the triangle moves. But its always rotating. How may I remove this lag so when I push a button keypress executes almost instantly? Using OpenGL with GLUT, on Linux. Thanks in advance!

Share this post

Link to post
Share on other sites
This code is from an example, I edited to play around.

// This code was created by Jeff Molofee '99 (ported to Linux/GLUT by Richard Campbell '99)
// If you've found this code useful, please let me know.
// Visit me at
// (email Richard Campbell at
#include <GL/glut.h> // Header File For The GLUT Library
#include <GL/gl.h> // Header File For The OpenGL32 Library
#include <GL/glu.h> // Header File For The GLu32 Library
#include <unistd.h> // Header File For sleeping.

/* ASCII code for the escape key. */
#define ESCAPE 27

/* The number of our GLUT window */
int window;

/* rotation angle for the triangle. */
float rtri = 0.0f;

/* rotation angle for the quadrilateral. */
float rquad = 0.0f;
float pos=0; // Triangle position
/* A general OpenGL initialization function. Sets all of the initial parameters. */
void InitGL(int Width, int Height) // We call this right after our OpenGL window is created.
glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black
glClearDepth(1.0); // Enables Clearing Of The Depth Buffer
glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading

glLoadIdentity(); // Reset The Projection Matrix

gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window


/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
void ReSizeGLScene(int Width, int Height)
if (Height==0) // Prevent A Divide By Zero If The Window Is Too Small

glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation



/* The main drawing function. */
void DrawGLScene()

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The View

glTranslatef(-1.5f + pos,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0

glRotatef(rtri,0.0f,1.0f,0.0f); // Rotate The Triangle On The Y axis
// draw a triangle (in smooth coloring mode)
glBegin(GL_POLYGON); // start drawing a polygon
glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glEnd(); // we're done with the polygon (smooth color interpolation)

glLoadIdentity(); // make sure we're no longer rotated.
glTranslatef(1.5f,0.0f,-6.0f); // Move Right 3 Units, and back into the screen 6.0

glRotatef(rquad,1.0f,0.0f,0.0f); // Rotate The Quad On The X axis
// draw a square (quadrilateral)
glColor3f(0.5f,0.5f,1.0f); // set color to a blue shade.
glBegin(GL_QUADS); // start drawing a polygon (4 sided)
glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glEnd(); // done with the polygon

rtri+=1.0f; // Increase The Rotation Variable For The Triangle
rquad-=1.0f; // Decrease The Rotation Variable For The Quad

// swap the buffers to display, since double buffering is used.

void idle()

/* The function called whenever a key is pressed. */
void keyPressed(unsigned char key, int x, int y)
/* sleep to avoid thrashing this procedure */

/* If escape is pressed, kill everything. */
//pos = (GLfloat)x/(GLfloat)y;
if (key == '3')
pos += 0.1;
if(key == '2')
pos -= 0.1;
if (key == ESCAPE)
/* shut down our window */

/* exit the program...normal termination. */

int main(int argc, char **argv)
/* Initialize GLUT state - glut will take any command line arguments that pertain to it or
X Windows - look at its documentation at */

glutInit(&argc, argv);

/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported
Depth buffer */


/* get a 640 x 480 window */
glutInitWindowSize(640, 480);

/* the window starts at the upper left corner of the screen */
glutInitWindowPosition(0, 0);

/* Open a window */
window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99");

/* Register the function to do all our OpenGL drawing. */

/* Go fullscreen. This is as soon as possible. */

/* Even if there are no events, redraw our gl scene. */

/* Register the function called when our window is resized. */

/* Register the function called when the keyboard is pressed. */

/* Initialize our window. */
InitGL(640, 480);

/* Start Event Processing Engine */

return 1;

Share this post

Link to post
Share on other sites
I just compiled it on XP it seems to work fine
the time lag comes when you hold a key down.
it may be caused by GLUT?

short answer ...I dont know.

Share this post

Link to post
Share on other sites
Original post by unfinished
the time lag comes when you hold a key down.
it may be caused by GLUT?

Sounds like the key repeat delay, something completely normal and not GLUT-related. Click any text field in any application, hold down, say, the letter 'a', and watch how it does not immediately start repeating.

By default, GLUT will interpret each 'a' as an event triggering your glutKeyboardFunc call back.

You can disable that with glutSetKeyRepeat(GLUT_KEY_REPEAT_OFF), but then it is up to you to keep track of whether a key is up or down - you will only get a single glutKeyboardFunc event when the key is pressed.

So, create an array of 256 bool, set to true in your glutKeyboardFunc callback, set to false in your glutKeyboardUpFunc callback.

Share this post

Link to post
Share on other sites
On Windows XP it works fine for me too. But on Win98 the same problem. What I noticed if I add the line "sleep(0)" in Win98 the delay goes away, On Linux I added "usleep(1)" to fix this problem in the "DrawGLScene" function.

The delay is like this, I push a button like escape to terminate. And it terminates about 3 seconds later.

Is it possible to do this without delaying like that?

Thanks in advance!

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using, you agree to our community Guidelines, Terms of Use, and Privacy Policy. is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!