次のような構造の OpenGL ES シーンを更新するための GCD 描画キューがあります。
- (void)drawFrame {
dispatch_async(drawingQueue, ^{
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) {
return;
}
@autoreleasepool {
[self startDrawing];
// drawing code
[self endDrawing];
}
dispatch_semaphore_signal(frameRenderingSemaphore);
});
}
アプリがアクティブでなくなるかバックグラウンドに入ると (両方)、CADisplayLink を無効にして OpenGL 描画実行ループを停止します。
ただし、問題は、CADisplayLink が無効になるまで、dispatch_asyn が描画ブロックをディスパッチすることです。ユーザーがホーム ボタンを押すと、iOS が既にコンテキストを破棄しているにもかかわらず、OpenGL でフレームを描画しようとしたため、アプリがクラッシュします。
GCD キューを強制終了/一時停止して、何もディスパッチしないようにする方法はありますか?