私はそれを解決する方法を知っているので、これは実際には問題ではありませんが、私が興味を持っていることです. 以下に、ストーリーボードのスクリーンショットを示します。これは非常に単純で、最初にメイン メニューをロードします。このメニューには、モーダル セグエを介して UIView をロードするボタンがあります。その UIView には、ルート ビュー コントローラーが GLKViewController であるナビゲーション コントローラーを持つコンテナー ビュー コントローラーが含まれています。メイン メニューに戻るには 2 つの方法があります。まず、一時停止ボタンを押すと、一時停止ビュー コントローラーが OpenGL ビュー コントローラーの上にプッシュされます。次に、そこにある [メニューに戻る] ボタンを押すと、アンワインド セグエがメイン メニューに戻ります。または、タイマーがゼロになるのを待ってゲームが終了し、その時点でゲーム オーバー ビュー コントローラーがセグエ経由で表示されます。そこからメインメニューに戻ることができます。このストーリーボードのスクリーンショットを以下にリンクします。
http://i.stack.imgur.com/2LKVQ.png
ゲーム オーバー ビュー コントローラーに 2 つのセグエが接続されていることに気付くかもしれません。もともと、モーダル セグエを使用してそのビュー コントローラーを表示していました。メイン メニューに巻き戻してから新しいゲームを開始しようとしたときを除いて、すべてがうまく機能しました。
if (![EAGLContext currentContext])
{
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
/* Reload all my buffers/textures/shaders/etc here */
}
else
{
self.context = [EAGLContext currentContext];
}
if (!self.context)
{
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
view.drawableMultisample = GLKViewDrawableMultisample4X;
[EAGLContext setCurrentContext:self.context];
大したことではありません。最初は、埋め込まれた GLKViewController が黒い画面を描画しただけでしたが、何が起こったのかを理解したとき、これは、古いコンテキストであり、将来の使用のためにキャッシュされていました。ただし、一時停止メニューを介して、またはプッシュ セグエを介してゲーム オーバー ビューの表示に切り替えた後、プッシュ セグエから巻き戻した場合、[EAGLContext currentContext] は nil ではなく、初期化したコンテキストと同じままでした。 GLKView を初めてロードしたとき。したがって、キャッシュされたすべてのバッファ/テクスチャ/シェーダなどを使用でき、それらをリロードする必要はありませんでした。
読んでみると、モーダルセグエから巻き戻すと現在のコンテキストが消去されるのに、プッシュセグエからそれを行うと消去されない理由がわかりません。読んで分かったのは、各スレッドは独自の EAGLContext を保持しており、View Controller のセグエをどのように設定しても、常にメイン スレッドにとどまっているということです。なぜこれが起こっているのか誰かが考えているかどうか、私は興味があります。