tl;dr: を に設定するだけでよい可能性がありGLKViewますcontentModeUIViewContentModeRedraw
まず、アプリケーションが実際にバックグラウンドに入るとは思いません。非アクティブになるだけだと思います。applicationWillResignActiveメソッドとapplicationDidEnterBackgroundデリゲート メソッドの違い。アプリケーションが非アクティブなだけであると仮定すると、実際にバックグラウンドに置かれる場合に備えて、以下を参照してください。
applicationWillResignActiveApple のドキュメントには、アプリケーションがバックグラウンドに入った後にのみ発生する OpenGL ES 呼び出しが許可されていないということではなく、呼び出されたときに「OpenGL ES フレームレートを下げる」必要があると記載されています。
これは、/がこの点で少し熱心すぎる可能性があることを意味しGLKitます。それを修正するには、次のことを確認する必要があります。GLKViewGLKViewController
- はに設定されてい
GLKViewますcontentModeUIViewContentModeRedraw
- のメソッドは、アプリケーションが非アクティブでフレームが変更されている場合でもフレームを描画し
GLKViewますが、アプリケーションがバックグラウンドにある場合はフレームを描画しません(つまり、OpenGL ES 呼び出しを使用します)。drawRect
ただし、drawRectアプリケーションがバックグラウンドにあるときはメソッドが呼び出されることさえないので、glkView:drawInRectデリゲート メソッドでの OpenGL ES 呼び出しについて実際に心配する必要はないと思います。ただし、この関数が状況で呼び出されない理由は、ビューが無効にならないためです。無効にされない理由は 2 つあります。
GLKViewControllerビューを定期的に無効にするメイン フレーム ループは、pausedプロパティによって一時停止されます。
- おそらくデフォルトの
GLKView contentMode「UIViewContetModeScaleToFill」です
GLKView drawRectメソッドはおそらくpausedプロパティを見ていないので、を変更するだけでcontentMode十分かもしれません。
アプリケーションが実際にバックグラウンドに移行する場合は、次の解決策を提案します。バックグラウンドでの実行中に OpenGL ES 呼び出しを使用することは許可されていないため、ソリューションは非常に簡単です。
バックグラウンドに入る前に、必要なものをサポートするために必要なすべての OpenGL ES 呼び出しを実行します。
つまりapplicationWillResignActive、次の手順を実行します。
- ゲーム ループを一時停止します ( を設定して実行します
GLKViewController) paused。
- レンダリング ループを一時停止します (
GLKViewControllerのを設定して行いますpaused) 。
- 現在の向きの状態の現在のフレーム バッファを取得します
- 回転した向きの状態に対応するフレームバッファとビューポートを使用して、現在のゲーム状態をもう一度レンダリングし、そのフレームバッファを取得します
さらに、方向の変更によってビューのフレームが変更された後にメソッドが実際に呼び出されるように、を に設定する必要がありますGLKView。contentModeUIViewContentModeRedrawdrawRect
最後にGLKViewのdrawRectメソッドで、 で保存されているフレームバッファの 1 つを取得し、通常の呼び出しでビューに描画するかどうかpausedを確認する必要があります。YESNONOYESapplicationWillResignActiveUIKit
このハックなソリューションが とどの程度うまく統合されるかはわかりませGLKitん。サブクラス化が必要になる場合があります。