启动和停止GLUT动画

时间:2012-02-09 10:31:00

标签: c glut

我在c项目中工作,我将进行一些繁重的物理计算,我希望能够在我完成时查看结果。它现在的工作方式是我在主线程上运行GLUT,并使用一个单独的线程(pthread)来做输入(从终端)和计算。我目前使用glutTimerFunc来做动画,但问题是,无论如何,该函数都会在每次给定时间内触发。我可以通过在动画函数中使用if语句来停止动画,停止变量进行更新,但这会占用大量不必要的资源(我认为)。

为了解决这个问题,我想我可以使用一个带有自定义计时器功能的额外线程,我可以自己控制(没有glutMainLoop弄乱的东西)。目前这是我的测试函数,用于检查这是否有效(意味着函数本身没有完成)。它在glutMainLoop:

之前的单独线程createt中运行
void *threadAnimation() {
    while (1) {
        if (animationRun) {
            rotate = rotate+0.00001;
            if (rotate>360) {
                rotate = rotate-360;
            }

            glutSetWindow(window);
            glutPostRedisplay();
        }
    }
}

我遇到的具体问题是动画只运行几秒钟,然后停止。有谁知道我怎么解决这个问题?我计划稍后使用计时器等,但我正在寻找的是确保将glutPostRedisplay发送到正确位置的方法。我认为glutSetWindow(窗口)是解决方案,但显然不是。如果我删除glutSetWindow(窗口),动画仍然可以工作,只是不长,但运行速度更快(所以glutSetWindow(窗口)可能会占用大量资源?)

btw变量" window"是这样创建的:

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
glutInitWindowSize(854, 540);
glutInitWindowPosition(100, 100);
window = glutCreateWindow("Animation View");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
timerInt = pthread_create(&timerThread, NULL, &threadAnimation, NULL);
glutMainLoop();

我不知道这是否正确,但它编译得很好。任何帮助都很受欢迎!

1 个答案:

答案 0 :(得分:0)

这是一个小小的想法,创建包含所有动态设置的类:

class DynamicInfo {
  public int vertexCount;
  public float *vertexes;

  ...

  DynamicInfo &operator=( const DynamicInfo &origin);
};

主要应用程序将包含那些:

DynamicInfo buffers[2];
int activeBuffer = 0;

在动画线程中只绘制(可能使用一些线程锁定一个变量):

DynamicInfo *current = buffers + activeBuffer; // Or rather use reference

在计算中:

// Store currently used buffer as current (for future manipulation)
DynamicInfo *current = buffers + activeBuffer;

// We finished calculations on activeBuffer[1] so we may propagate it to application
activeBuffer = (activeBuffer + 1)%2;

// Let actual data propagate to current buffer
(*current) = buffers[activeBuffer];

再次锁定一个变量。