彼らは提案します:
GCD を使用する場合は、専用のシリアル キューを使用してコマンドを OpenGL ES にディスパッチします。これは、従来のミューテックス パターンを置き換えるために使用できます。
この推奨事項がわかりません。私が解決できないこの競合があります:
アプリのアプリ デリゲートが呼び出しを受け取ると、すぐに OpenGL 関数の呼び出しを停止-applicationWillResignActive
する必要があります。
-applicationWillResignActive
返された後もアプリが OpenGL 関数を呼び出し続けると、アプリがクラッシュします。
シリアル バックグラウンド キューで OpenGL 関数を呼び出すという Apple の推奨事項に従うと、この一見解決できない問題に直面します。
1) 受信したら、それ以上の OpenGL 関数の呼び出しをすぐに-applicationWillResignActive
停止する必要があります。
2) しかし、シリアル キューはバックグラウンドでコード ブロックを処理している最中であるため、コード ブロックがafter
-applicationWillResignActive
リターンの実行を終了し、アプリがクラッシュすることがあります。
これは、同時「ブロック」を示す図です。メイン スレッドは完全な停止メッセージを受信し、OpenGL ES へのさらなる呼び出しを防止する必要があります。しかし残念ながら、これらはバックグラウンド キューで発生し、ブロックの処理中に停止することはできません。
|_____main thread: "STOP calling OpenGL ES!"_____|
_____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
技術的には、バックグラウンド キューを即座に停止し、バックグラウンドでの OpenGL のさらなる呼び出しを回避する方法を見つけられませんでした。一度実行されたサブミットされたコード ブロックは実行され続けます。
私が見つけた唯一の解決策は、バックグラウンドで OpenGL ES 関数を呼び出さないことでした。代わりに、メイン スレッドで呼び出して、アプリが GPU へのアクセスを失った後に呼び出されないようにします。
では、バックグラウンドで OpenGL ES 関数を呼び出しても問題ない場合、アプリがアクティブにリグジットした後に関数が呼び出されないようにするにはどうすればよいでしょうか?