opengl + перенасыщение glutPostRedisplay где? - PullRequest
0 голосов
/ 05 января 2011

Я программирую на C с GLUT и OPENGL, я хочу, чтобы мое окно перерисовывалось снова и снова.Я знаю, что могу выполнить повторный рендеринг с glutPostRedisplay(), если я добавлю его в функцию простоя Glut, в которой мой компьютер зависает.

Мой код соответствует atm

void on_idle() {
    glutPostRedisplay();
}
void on_draw() {
    ...
    glClearColor(1.f, 1.f, 1.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT);
    ...
    glFlush();
}
int main(int argc, char** argv) {
    ...
    glutDisplayFunc(&on_draw);
    glutIdleFunc(&on_idle);
    ...
}

Ответы [ 3 ]

0 голосов
/ 06 января 2011

Перевести в режим ожидания, оставляя любые левые циклы ЦП на интервале времени прямо перед glutPostRedisplay:

void on_idle() {
#ifdef WIN32
    Sleep(0); // zero sleep = yield
#else ifdef _POSIX_PRIORITY_SCHEDULING
    sched_yield(); // #include <sched.h>
#endif
    glutPostRedisplay();
}
0 голосов
/ 10 января 2011

Я не совсем понимаю ваш вопрос ... что означает "вы хотите, чтобы ваше окно перерисовывалось снова и снова"?

GLUT делает это сам с функцией glutMainLoop (), которая продолжает вызывать функцию обратного вызова дисплея (обычно проблема в обратном ... люди спрашивают, как они могут выйти из бесконечного цикла программно ... что невозможно с GLUT, но не с FreeGLUT)

Нет необходимости помещать повторное отображение в функцию ожидания, которая вызывается только тогда, когда ничего не происходит ...

0 голосов
/ 05 января 2011

Попробуйте это:

void on_timer(int value) {
    glutPostRedisplay();
    glutTimerFunc(33, on_timer, 0);
}
void on_draw() {
    ...
    glClearColor(1.f, 1.f, 1.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT);
    ...
    glFlush();
}
int main(int argc, char** argv) {
    ...
    glutDisplayFunc(on_draw);
    glutTimerFunc(33, on_timer, 0)
    ...
}
...