У меня есть приложение 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 и моему выполнению приложения. В процессе выполнения я создаю целый набор объектов. Я хотел бы очистить их. Есть ли какой-либо способ, которым я могу сказать ИЗБЫТКУ называть метод очистки, прежде чем он выйдет?
Обычно этого делать не нужно; простой выход из приложения приведет к отключению всех выделенных вами ресурсов. Даже если вы сделали снимок экрана, он должен вернуться в нормальное состояние.
Если вы используете C / C ++, может быть, вы можете использовать вызов atexit () ?
{{1} } Время от времени я попадал на это, пытаясь поиграть с 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 и по-прежнему контролировать цикл обработки событий и при необходимости освободите ресурсы.