エディターを作成していますが、openglアプリからネイティブファイルの保存/開くダイアログを呼び出すという問題があります。エディターは私のゲーム内のopenglguiで書かれています。そこで、ユーザーが「ロード」または「保存」を押すと、必要な(非表示の)wxウィンドウを作成するスレッドを作成し、wxFileDialogを呼び出し、ジョブの完了後にそのスレッドを削除するというアイデアを思いつきました。 。openglアプリからクロスプラットフォームの方法でファイルを開く/保存するダイアログにアクセスすることは可能ですか、それとももっと良いアプローチがありますか?
3 に答える
wxWidgetにはOpenGLウィジェットがあります。OpenGLのものをこれに入れ、ウィジェットが受信したイベントをGUIシステムに転送すると、イベントループを争う必要がなくなります。
GLUTまたは同等のものを使用している場合は、クロスプラットフォームフレームワークがありません。クロスプラットフォームアプリが必要な場合は、フレームワーク(wxWidgetsやQtなど)を選択して、そこから先に進む必要があります。それ以外の場合は、Windowsを使用している場合はWindows APIへのネイティブ呼び出しを使用でき、他のプラットフォームでは同等の呼び出しを使用できます。
GLUTは、コンソールスタイルのアプリケーションのみを提供します。GUIが必要な場合は、クロスプラットフォームが必要ない場合でも、GUIフレームワークを選択する必要があります。選択できるものはたくさんありますが、選択は主にあなたが最もよく知っているものに依存します。次に、GUIアプリケーションからOpenGLライブラリへの呼び出しを追加しますが、ビルドされています。このように、複数のスレッドをいじくり回す必要はありません。
GLUTアプリケーションに多額の投資をしていて、いくつかのGUI機能を取得するためだけにそれを破棄したくない場合があります。この場合、GLUTアプリケーションとは別に新しいGUIアプリを作成することをお勧めします。このアプリは、ソケット(または他のプロセス間通信システム)を使用して既存のアプリと通信しますが、別のプロセスで実行されます。このようにして、マルチスレッドアプリによって作成された、恐ろしくて修正が難しいバグに遭遇することはありません。
他の人がすでに言っているように、最も簡単な解決策は、メインループにwxWidgetsを使用し、OpenGLのものにwxGLCanvasを使用することです。
しかし、これが不可能な場合は、何らかの理由で、実際に別のスレッドからwxWidgetsを使用できるはずです。wxWidgets GUI機能は単一のスレッドからのみ使用できるため、そのスレッドからも初期化する必要があることに注意してください。そしてもちろん、wxWidgetsはプログラムの残りの部分について何も知らないので、スレッドの同期を自分で処理する必要があります。