Freeglut ew glutIdleFunc导致滞后 [英] Freeglut glew glutIdleFunc cause lag
问题描述
我刚开始使用freeglut和glew,让它运行对我来说已经很困难了.因此,现在我开始使用敏捷的教程进行编码,并且显示了一个正方形,效果很好.现在,我要用箭头键使正方形移动.
I'm just starting out with freeglut and glew and getting it running was already quite hard for me. So now I started coding with tutorials from swiftless and I had a square displayed worked fine. Now I got to the point where I want to make the square move with the arrow keys.
从我插入glutIdleFunc的那一点开始,它开始滞后.我无法移动窗口或单击其他任何东西大约一分钟.如果我尝试拖动窗口,则它会在大约2分钟后移动.
From the point I inserted the glutIdleFunc it started lagging. I cant move the window or click on anything else for about a minute. If I try draging the window then it moves after about 2 min.
我尝试使用以下代码进行此操作:
I tried doing this with the following code :
#include <GL/glew.h>
#include <GL/glut.h>
bool* keyStates = new bool[256];
float positionX = 0;
void renderPrimitive (void)
{
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 0.0f); // The bottom left corner
glVertex3f(-1.0f, 1.0f, 0.0f); // The top left corner
glVertex3f(1.0f, 1.0f, 0.0f); // The top right corner
glVertex3f(1.0f, -1.0f, 0.0f); // The bottom right corner
glEnd();
}
void keySpecial (int key, int x, int y)
{
if (keyStates[GLUT_KEY_RIGHT])
{
positionX++;
}
}
void display (void)
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Clear the background of our window to red
glClear(GL_COLOR_BUFFER_BIT); //Clear the colour buffer (more buffers later on)
glLoadIdentity(); // Load the Identity Matrix to reset our drawing locations
glTranslatef(0.0f, 0.0f, -5.0f);
renderPrimitive();
glFlush(); // Flush the OpenGL buffers to the window
}
void reshape (int width, int height)
{
glViewport(0, 0, (GLsizei)width, (GLsizei)height); // Set our viewport to the size of our window
glMatrixMode(GL_PROJECTION); // Switch to the projection matrix so that we can manipulate how our scene is viewed
glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
glMatrixMode(GL_MODELVIEW); // Switch back to the model view matrix, so that we can start drawing shapes correctly
}
void keyPressed (unsigned char key, int x, int y)
{
keyStates[key] = true; // Set the state of the current key to pressed
}
void keyUp (unsigned char key, int x, int y)
{
keyStates[key] = false; // Set the state of the current key to not pressed
}
int main (int argc, char **argv)
{
glutInit(&argc, argv); // Initialize GLUT
glutInitDisplayMode (GLUT_SINGLE); // Set up a basic display buffer (only single buffered for now)
glutInitWindowSize (500, 500); // Set the width and height of the window
glutInitWindowPosition (100, 100); // Set the position of the window
glutCreateWindow ("Your first OpenGL Window"); // Set the title for the window
glutDisplayFunc(display); // Tell GLUT to use the method "display" for rendering
glutReshapeFunc(reshape); // Tell GLUT to use the method "reshape" for reshaping
glutIdleFunc(display);
glutKeyboardFunc(keyPressed); // Tell GLUT to use the method "keyPressed" for key presses
glutKeyboardUpFunc(keyUp); // Tell GLUT to use the method "keyUp" for key up events
glutSpecialFunc(keySpecial);
glutMainLoop(); // Enter GLUT's main loop
}
我不希望这是硬件问题,因为我的计算机可以玩大型游戏.
I don't expect this to be a hardware problem since my computer can play big games.
推荐答案
您应该避免在闲置函数中进行任何GL绘图.如果要连续重绘场景,请使用空闲功能,例如
You should avoid doing any GL drawing in the idle function. If you want to redraw your scene continuously, use an idle function like
void idle(void)
{
glutPostRedisplay();
}
看看是否有帮助.
这篇关于Freeglut ew glutIdleFunc导致滞后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!