8

変更しようとしているOSXOpenGLアプリがあります。アプリを作成すると、多数の初期化関数が呼び出されます。これには、独自のマウスハンドラーやキーボードハンドラーなどを指定できるメソッドが含まれます。例:

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に指示する方法はありますか?

4

5 に答える 5

10

あなたがこれを呼び出す場合、freeglutで:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION)

メイン ループに入る前に、ウィンドウを閉じるとメイン ループ関数が戻り、クリーンアップを実行できます。

その段階で GL コンテキストは既に破棄されているため、GL 操作を実行できないことに注意してください。

于 2011-10-12T02:21:02.813 に答える
4

GLUTで遊んでみたら、たまにこれにハマってしまいました。メイン関数でキャッチされた例外を介してIIRCを終了するなど、できる限りのことを試しglutMainLoopましたが...

使用時glutMainLoop

私の解決策は次のとおりです。すべてのリソースの所有者になるグローバルContextオブジェクトを作成し、デストラクタでそれらのリソースを解放します。

このグローバルContextオブジェクト デストラクタは、メインを終了した直後に呼び出されます。

メイン関数で宣言された変数ではなく、グローバル変数であることが重要Contextです。なぜなら、まだ私を逃れる理由 (この実装の選択の重要性をまだ見ていない) のため、glutMainLoop は返されないからです。

私の Linux ボックス (Ubuntu) では、デストラクタが正しく呼び出されます。WindowsでもMacOSでも同じように動作するはずです。

これはatexit()可能性のある制限のない、Francisco Soto のソリューションの C++ バージョンであることに注意してください。

使用するglutMainLoopEvent

どうやら、一部の実装には、glutMainLoop を呼び出す代わりに使用できる glutMainLoopEvent があります。

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

glutMainLoopEvent保留中のイベントのみを解決してから戻ります。for(;;)したがって、への呼び出しの周りにイベント ループ (コンストラクト) を提供する必要がありますglutMainLoopEventが、この方法では、GLUT を操作しながらイベント ループを制御し、必要に応じてリソースを解放できます。

于 2010-04-22T15:46:13.357 に答える
3

C / C ++を使用している場合は、atexit()呼び出しを使用できますか?

于 2010-04-22T04:00:12.117 に答える
0

通常、これを行う必要はありません。アプリケーションを終了するだけで、割り当てたリソースがすべて破棄されます。画面をキャプチャした場合でも、通常の状態に戻るはずです。

于 2010-04-22T04:03:09.970 に答える