OpenGL GLUT окно очень медленно, почему?

проблема

Я только что начал работать с OpenGL, используя GLUT. Приведенный ниже код компилирует и отображает два каркасных Куба и сферу. Проблема в том, что когда я пытаюсь перетащить или изменить размер окна, это вызывает заметную задержку, прежде чем следовать за моей мышью.

эта проблема не возникает на компьютере моего коллеги, тот же код.

Я работаю с Visual Studio 2012 C++ express на компьютере с Windows 7. Я не опытный программист.

код

    // OpenGLHandin1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <GL/glut.h>

void initView(int argc, char * argv[]){
    //init here
    glutInit(&argc, argv);
    //Simple buffer
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGBA );
    glutInitWindowPosition(100,100);
    glutInitWindowSize(800,400);
    glutCreateWindow("Handin 2");
}
void draw(){

    glClearColor(0,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);
    //Background color

    glPushMatrix();
    glLoadIdentity();
    glTranslatef(0.6, 0, 0);

    glColor3f(0.8,0,0);
    glutWireCube(1.1); //Draw the cube
    glPopMatrix();

    glPushMatrix();
    glLoadIdentity();
    glTranslatef(-0.5, 0, -0.2);

    glColor3f(0,0.8,0);
    glutWireCube(1.1); //Draw the cube
    glPopMatrix();

    glPushMatrix();
    glLoadIdentity();
    glTranslatef(0, 1.2, 0);
    glRotatef(90, 1, 0, 0);

    glColor3f(1,1,1);
    glutWireSphere(0.6, 20, 20); //Draw the sphere
    glPopMatrix();

    //draw here
    //glutSwapBuffers();
    glutPostRedisplay();
    glFlush();

}
void reshape (int w, int h){
    glViewport(0,0,w ,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, (float)w/(float)h, 1.5, 10);
    gluLookAt(1.5, 2.5, 4, 
              0, 0.6, 0, 
              0, 1, 0); //Orient the camera
    glRotatef(5, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char * argv[])
{
    initView(argc,argv);
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    glutMainLoop();
}

1 ответов


устранение:

Кажется, что простое решение с использованием Sleep(1) в функции render работал. Вы также спросили, почему - я не уверен, что смогу решить это правильно, но вот мое лучшее предположение:

почему это вообще работает?

ваши сокурсники могут включить VSync по умолчанию в своих драйверах. Это заставляет их код работать только так быстро, как экран может обновляться, скорее всего, 60 кадров в секунду. Это дает вам около 16 миллисекунды для рендеринга кадра, и если код эффективен (принимая, скажем, 2 мс для рендеринга), он оставляет много времени для процессора, чтобы делать другие связанные с ОС вещи, такие как перемещение окна.

теперь, если вы отключите вертикальную синхронизацию, программа попытается отобразить как можно больше кадров, эффективно засоряя все остальные процессы. Я предложил вам использовать сон, потому что он показывает эту конкретную проблему. Это не имеет значения, если это 1 или 3 мс, что он действительно делает, это сказать " Эй, CPU, я сейчас ничего не делаю, поэтому вы можете делать другие вещи".

но разве это не замедляет мою программу?

использование сна является общей техникой. Если вы обеспокоены тем, что потеряли 1 мс каждый кадр, вы также можете попробовать положить Sleep(0), как он должен действовать точно так же - давая свободное время процессора. Вы также можете попробовать включить вертикальную синхронизацию и проверить, действительно ли моя догадка верна.

в качестве примечания, вы также можете посмотреть при использовании CPU графики с и без сна. Он должен быть 100% (или 50% на двухъядерном процессоре) без (работает как можно быстрее) и намного ниже, в зависимости от ваших требований к программе и скорости вашего процессора.

дополнительные замечания о Sleep(0)

после того, как интервал сна уже прошел, поток готов к запуску. Если вы укажете 0 миллисекунд, поток откажется от оставшейся части своего временного среза, но останется готовым. Обратите внимание, что готов поток не гарантируется для запуска немедленно. Следовательно, поток не может выполняться до некоторого времени после истечения интервала сна. - это здесь.

также обратите внимание, что в системах Linux поведение может немного отличаться; но я не эксперт linux; возможно, прохожий мог бы уточнить.