opengl+glut glutPostRedisplay在哪里?

发布于 2024-10-10 09:00:08 字数 451 浏览 2 评论 0原文

我正在使用 GLUT 和 OPENGL 用 C 进行编程,我希望我的窗口能够一次又一次地重新绘制。我知道如果我将其放入 Glut 的空闲函数中,我可以使用 glutPostRedisplay() 重新渲染,但我的电脑会出现延迟。

我的代码遵循 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);
    ...
}

I'm programming in C with GLUT and OPENGL, i want my window redrawing itself again and again. I know that i can rerender with glutPostRedisplay(), if I put it in the idle function of Glut my pc lags.

My code is following 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);
    ...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荒人说梦 2024-10-17 09:00:08

试试这个:

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)
    ...
}

Try this:

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)
    ...
}
℉絮湮 2024-10-17 09:00:08

在 glutPostRedisplay 之前的时间片上使空闲产生任何剩余的 CPU 周期:

void on_idle() {
#ifdef WIN32
    Sleep(0); // zero sleep = yield
#else ifdef _POSIX_PRIORITY_SCHEDULING
    sched_yield(); // #include <sched.h>
#endif
    glutPostRedisplay();
}

Make idle yielding any left CPU cycles on the time slice right before the glutPostRedisplay:

void on_idle() {
#ifdef WIN32
    Sleep(0); // zero sleep = yield
#else ifdef _POSIX_PRIORITY_SCHEDULING
    sched_yield(); // #include <sched.h>
#endif
    glutPostRedisplay();
}
酒几许 2024-10-17 09:00:08

我不太明白你的问题......你是什么意思“你希望你的窗口一次又一次地重新绘制自己”?

GLUT 使用 glutMainLoop() 函数自行完成此操作,该函数不断调用显示回调函数(通常问题是相反的...人们问如何以编程方式离开无限循环..这对于 GLUT 是不可能的,但对于 FreeGLUT 则不然)

无需将重新显示放在空闲函数中,该函数仅在没有其他事情发生时调用...

I don't quite understand your question... what do yo mean "you want your window redrawing itself again and again" ?

GLUT does that itself with the glutMainLoop() function that keeps calling the display call back function (Usually the problem is the reversed... people ask how they can leave the infinite loop programmatically.. which is impossible with GLUT, but not with FreeGLUT)

No need to put the redisplay in the idle function, which is only called when nothing else is happening...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文