Freeglut ew glutIdleFunc导致滞后 [英] Freeglut glew glutIdleFunc cause lag

查看:119
本文介绍了Freeglut ew glutIdleFunc导致滞后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚开始使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆