退出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