Чистка при выходе из приложения OpenGL

У меня есть приложение OpenGL OSX, которое я пытаюсь изменить. Когда я создаю приложение, целый набор функций инициализации называют - включая методы, где я могу указать свои собственные обработчики мышей и клавиатур и т.д. Например:

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(700, 700);
glutCreateWindow("Map Abstraction");
glutReshapeFunc(resizeWindow);
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);
glutMouseFunc(mousePressedButton);
glutMotionFunc(mouseMovedButton);
glutKeyboardFunc(keyPressed);

В какой-то момент я передаю управление к glutMainLoop и моему выполнению приложения. В процессе выполнения я создаю целый набор объектов. Я хотел бы очистить их. Есть ли какой-либо способ, которым я могу сказать ИЗБЫТКУ называть метод очистки, прежде чем он выйдет?

8
задан genpfault 7 October 2016 в 19:04
поделиться

3 ответа

Обычно этого делать не нужно; простой выход из приложения приведет к отключению всех выделенных вами ресурсов. Даже если вы сделали снимок экрана, он должен вернуться в нормальное состояние.

0
ответ дан 5 December 2019 в 10:01
поделиться

Если вы используете C / C ++, может быть, вы можете использовать вызов atexit () ?

{{1} }
3
ответ дан 5 December 2019 в 10:01
поделиться

Время от времени я попадал на это, пытаясь поиграть с GLUT. Я пробовал все, что мог, в том числе выход из IIRC glutMainLoop через исключение, обнаруженное в основной функции, но ...

При использовании glutMainLoop

Мое решение было следующим: Создать global Context объект, который будет владельцем всех ваших ресурсов, и освободить эти ресурсы в деструкторе.

Этот деструктор глобального объекта Context будет вызываться сразу после выхода из основного.

Важно Контекст - это глобальная переменная, а не переменная, объявленная в основной функции, потому что по причине, которая все еще ускользает от меня (я все еще не вижу интереса к этому выбору реализации), glutMainLoop не вернется.

В моем Linux (Ubuntu) деструктор вызывается правильно. Думаю, это должно работать одинаково и в Windows, и в MacOS.

Обратите внимание, что это версия решения Франсиско Сото atexit () на C ++ без возможных ограничений.

Использование glutMainLoopEvent

Очевидно, в некоторых реализациях есть glutMainLoopEvent, который можно использовать вместо вызова glutMainLoop.

http://openglut.sourceforge.net/group__mainloop.html#ga1

glutMainLoopEvent разрешит только ожидающие события и затем вернется. Таким образом, вы должны предоставить цикл событий (конструкция for (;;) ) вокруг вызова glutMainLoopEvent , но таким образом вы можете работать с GLUT и по-прежнему контролировать цикл обработки событий и при необходимости освободите ресурсы.

4
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: