Запуск и остановка анимации GLUT

Я работаю над проектом на языке C, где я собираюсь сделать несколько сложных физических расчетов, и мне нужна возможность увидеть результаты, когда я закончу. Сейчас это работает так: я запускаю GLUT в основном потоке и использую отдельный поток (pthread) для ввода (из терминала) и вычислений. В настоящее время я использую glutTimerFunc для анимации, но проблема в том, что эта функция будет срабатывать каждый заданный интервал времени, несмотря ни на что. Я могу остановить анимацию, используя оператор if в функции анимации, остановив обновление переменных, но это требует много ненужных ресурсов (я думаю).

Чтобы решить эту проблему, я подумал, что мог бы использовать дополнительный поток с пользовательской функцией таймера, которой я мог бы управлять сам (без того, чтобы GluMainLoop все испортил). В настоящее время это моя тестовая функция, чтобы проверить, будет ли она работать (это означает, что сама функция никоим образом не завершена). Он запускается в отдельном потоке, созданном непосредственно перед glutMainLoop:

void *threadAnimation() {
    while (1) {
        if (animationRun) {
            rotate = rotate+0.00001;
            if (rotate>360) {
                rotate = rotate-360;
            }

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

Конкретная проблема, с которой я сталкиваюсь, заключается в том, что анимация запускается всего на пару секунд, а затем останавливается. Кто-нибудь знает, как я могу это исправить? Я планирую использовать таймеры и т. д. позже, но я ищу способ гарантировать, что glutPostRedisplay будет отправлен в нужное место. Я думал, что glutSetWindow(window) – это решение, но, видимо, это не так. Если я удаляю glutSetWindow(window), анимация все еще работает, только не так долго, но работает намного быстрее (так что, возможно, glutSetWindow(window) требует много ресурсов?)

Кстати, переменная "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();

Я не знаю, правильно ли это, но компилируется просто отлично. Любая помощь очень приветствуется!


person user1143657    schedule 09.02.2012    source источник


Ответы (1)


Вот небольшая идея, создайте класс, который будет содержать все динамические настройки:

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];

Опять блокировка одной переменной.

person Vyktor    schedule 09.02.2012