退出OpenGL应用程序时进行清理

我有一个我想修改的OSX OpenGL应用程序。 当我创建应用程序时,会调用一大堆初始化函数 - 包括可以指定我自己的鼠标和键盘处理程序等的方法。例如:

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,并且我的应用程序运行。 在运行过程中,我创建了一大堆对象。 我想清理这些。 有什么方法可以告诉GLUT在退出前调用清理方法?


在freeglut中,如果你调用这个:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION)

在进入主循环之前,当窗口关闭时,主循环函数将返回,您可以进行清理。

值得注意的是,在这个阶段,GL上下文已经被销毁,所以你不能执行任何GL操作。


我曾经为此而摔倒,试图与GLUT一起玩。 我尝试了所有可能的事情,包括IIRC通过主函数中glutMainLoop的异常退出glutMainLoop ,但...

使用glutMainLoop

我的解决方案如下:创建一个全局Context对象,谁将成为您所有资源的所有者,并在析构函数中释放这些资源。

这个全局Context对象析构函数将在退出main之后立即调用。

重要的是Context是一个全局变量,而不是主函数中声明的变量,因为出于某种原因仍然逃避我(我仍然没有看到这个实现选择的兴趣),glutMainLoop不会返回。

在我的Linux中(Ubuntu),析构函数被正确调用。 我想它也应该在Windows和MacOS上以相同的方式工作。

请注意,这是Francisco Soto的atexit()解决方案的C ++版本,没有可能的限制。

使用glutMainLoopEvent

显然,一些实现有一个glutMainLoopEvent,可以用来代替调用glutMainLoop。

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

glutMainLoopEvent只会解析未决事件,然后返回。 因此,您必须提供围绕调用glutMainLoopEvent的事件循环( for(;;)构造),但这样,您可以使用GLUT并仍然可以控制事件循环,并在需要时释放资源。


如果你使用C / C ++,也许你可以使用atexit()调用?

链接地址: http://www.djcxy.com/p/38431.html

上一篇: Cleaning up when exiting an OpenGL app

下一篇: Setting up a camera in OpenGL