Бесконечный L oop на OpenGL - PullRequest
0 голосов
/ 19 апреля 2020

Я решил, что всякий раз, когда пользователь пытается изменить размер экрана, экран должен go возвращаться к заданным размерам, поэтому это облегчает мою жизнь при рисовании узлов графа. На MA C мое приложение работает нормально, но на Linux оно вызывает infinte l oop в функции изменения размера, и я не знаю почему. После некоторых вызовов l oop я получил ошибку сегментации (ядро сброшено)

вот моя конфигурация opengl (основная функция)

glutInit(&argc, argv);
glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow(APP_NAME);
glClearColor(0.0, 0.0, 0.0, 0.0);         // black background
glMatrixMode(GL_PROJECTION);              // setup viewing projection
glLoadIdentity();                           // start with identity matrix
glOrtho(0.0, 50.0, 0.0, 50.0, 0.0, 0.1);   // setup a 50x50 viewing world
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutMainLoop();

и вот мои реализации функций отображения и изменения размера

void display() {
      Matrix* distanceMatrix = NULL;
      PalleteNodePosition* nodesPositions = NULL;
      distanceMatrix = fromFile(inputFileName);
      printf("Finish input parsing...\n");
      nodesPositions = calculateNodesPositions(distanceMatrix);
      printf("Finish calculating nodes position on screen...\n");
      glClear( GL_COLOR_BUFFER_BIT);
      drawNodes(nodesPositions, distanceMatrix->width);
      drawLink(10, 10, 18, 18);
      glFlush();
}

void resize(int w, int h){
      glutReshapeWindow(WINDOW_WIDTH, WINDOW_HEIGHT);
}

Когда я печатаю вызов изменения размера, я получил w, равный WINDOW_WIDTH, и h, равный WINDOW_HEIGHT, как и ожидалось, так почему приложение каждый раз изменяет размер экрана?

1 Ответ

1 голос
/ 19 апреля 2020

Ваш resize() обратный вызов будет вызван сам по себе, даже если он выполняется асинхронно.
Вы просите, чтобы оконная система изменила размер вашего окна, а затем вы получите событие, которое говорит, что ваше окно было изменено. , тогда ваш обратный вызов срабатывает, что приводит к новому запросу на изменение размера ...
Если никто не останавливает это l oop (очевидно, система управления окнами не обнаруживает, что изменение размера на самом деле не требуется), оно бесконечно.

Может быть, стоит подумать о сравнении w и h с ожидаемыми значениями внутри вашего resize() обратного вызова и вызывать glutReshapeWindow() только если это действительно необходимо?

Вам следует Также имейте в виду, что внутренний размер и внешний размер окна, вероятно, различаются (граница, строка заголовка ...).

...