Jump to content
  • Advertisement
Sign in to follow this  
Four

Keypress is lagging

This topic is 4968 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
Advertisement
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 www.demonews.com/hosted/nehe
// (email Richard Campbell at ulmont@bellsouth.net)
//
#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

glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset The Projection Matrix

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

glMatrixMode(GL_MODELVIEW);
}

/* 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
Height=1;

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

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}

/* 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.
glutSwapBuffers();

}
void idle()
{

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

/* 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 */
glutDestroyWindow(window);

/* exit the program...normal termination. */
exit(0);
}
}

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 http://reality.sgi.com/mjk/spec3/spec3.html */

glutInit(&argc, argv);

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

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);

/* 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. */
glutDisplayFunc(&DrawGLScene);

/* Go fullscreen. This is as soon as possible. */
glutFullScreen();

/* Even if there are no events, redraw our gl scene. */
glutIdleFunc(&idle);

/* Register the function called when our window is resized. */
glutReshapeFunc(&ReSizeGLScene);

/* Register the function called when the keyboard is pressed. */
glutKeyboardFunc(&keyPressed);

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

/* Start Event Processing Engine */
glutMainLoop();

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
Quote:
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 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!