glutTimerFunc () не ограничивает частоту кадров

glutTimerFunc не делает задержку, а просто зацикливается навсегда. Как fxp. а (1). Я что-то не так? Или это проблема совместимости? Я использую Arch Linux x64 с gcc. И я как бы смешивал 32-битные программы с 64-битными.
Я пытаюсь создать программу, которая проверяет ввод при постоянном обновлении кадров с задержкой.
Мои включает:

#include <GL/glut.h>
#include <GL/glu.h>
#include <stdio.h>
#include <string.h>

И мои основные функции:

void timer(void)
{
    glutPostRedisplay();
    glutTimerFunc ( 30 , mainloop , 0 );
}

int main() {
    loadconfiguration();
    char *myargv [1];
    int myargc=1;
    myargv [0]=strdup ("./file");
    glutInit(&myargc, myargv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(displayx, displayy);
    printf("Making a window\n");
    winIDMain = glutCreateWindow("GL Game");
    mainloop();
}
void mainloop(void){

    Initilize();
    glutSetWindow (winIDMain);
    glutDisplayFunc (render);
    glutReshapeFunc (reshape);
    glutKeyboardFunc (keyboard);
    glutMouseFunc (mouse);
    glutIdleFunc (timer);
    glutMainLoop();
}

Не волнуйтесь, остальные функции чистые :)
Код работал раньше Не знаю, почему он не работает сейчас.


person nik123    schedule 24.06.2015    source источник


Ответы (1)


Ваш mainloop должен называться init. Все, что он делает, это устанавливает обратные вызовы перенасыщения. Вместо того, чтобы вызывать glutPostRedisplay в функции ожидания, вы должны вызывать его в timer функции. Другими словами, не звоните glutIdleFunc(timer);. Вместо этого вызовите timer() один раз и попросите его добавить к себе таймер glutTimerFunc (30 , timer, 0);.

Тем не менее, я бы порекомендовал установить тайминг для ограничителя кадров самостоятельно, так как он будет намного точнее. Я написал этот ответ именно для этого.

person jozxyqk    schedule 24.06.2015