tl;dr: を に設定するだけでよい可能性がありGLKView
ますcontentMode
UIViewContentModeRedraw
まず、アプリケーションが実際にバックグラウンドに入るとは思いません。非アクティブになるだけだと思います。applicationWillResignActive
メソッドとapplicationDidEnterBackground
デリゲート メソッドの違い。アプリケーションが非アクティブなだけであると仮定すると、実際にバックグラウンドに置かれる場合に備えて、以下を参照してください。
applicationWillResignActive
Apple のドキュメントには、アプリケーションがバックグラウンドに入った後にのみ発生する OpenGL ES 呼び出しが許可されていないということではなく、呼び出されたときに「OpenGL ES フレームレートを下げる」必要があると記載されています。
これは、/がこの点で少し熱心すぎる可能性があることを意味しGLKit
ます。それを修正するには、次のことを確認する必要があります。GLKView
GLKViewController
- はに設定されてい
GLKView
ますcontentMode
UIViewContentModeRedraw
- のメソッドは、アプリケーションが非アクティブでフレームが変更されている場合でもフレームを描画し
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
。contentMode
UIViewContentModeRedraw
drawRect
最後にGLKView
のdrawRect
メソッドで、 で保存されているフレームバッファの 1 つを取得し、通常の呼び出しでビューに描画するかどうかpaused
を確認する必要があります。YES
NO
NO
YES
applicationWillResignActive
UIKit
このハックなソリューションが とどの程度うまく統合されるかはわかりませGLKit
ん。サブクラス化が必要になる場合があります。