Appleのドキュメントによると、CGLFlushDrawable
またはそれと同等のCocoaflushBuffer
は、いくつかの異なる方法で動作する可能性があります。通常、ウィンドウ化されたアプリケーションの場合、バック バッファーの内容は、次のように可視バッファーにコピーされます。
CGLFlushDrawable
ダブル バッファリングされたコンテキストのバック バッファをフロント バッファにコピーします。
描画バッファの内容はそのまま残されていると思います (質問 1. を参照)。私が間違っていても、kCGLPFABackingStore
属性を に渡すことで保証できますCGLChoosePixelFormat
。
しかし、さらに読むと、状況によっては、コピーが実行されるのではなく、バッファーがスワップされる可能性があることがわかります。
バッキング ストア属性が false に設定されている場合、バッファはコピーではなく交換できます。これは、フルスクリーン モードの場合によく発生します。
また、これは述べています
フルスクリーン ウィンドウの上にコンテンツがない場合、Mac OS X は自動的にこのコンテキストのパフォーマンスを最適化しようとします。たとえば、アプリケーションがオブジェクトを呼び出す
flushBuffer
とNSOpenGLContext
、システムはバック バッファーの内容をフロント バッファーにコピーするのではなく、バッファーをスワップする場合があります。(...) システムはバッファーをコピーするのではなくスワップすることを選択する場合があるため、アプリケーションは を呼び出すたびにシーンを完全に再描画する必要がありますflushBuffer
。
そして、ここに私の質問があります:
- バック バッファがコピーされた場合、バッキング ストア属性がなくても内容が保持されることが保証されますか?
- バッファがスワップされた場合、バック バッファはフロント バッファの内容を取得しますか、それとも定義されていないため、ランダムなものを取得することもできますか?
- システムはバッファのスワップを選択する場合がありますが、実際にスワップを選択したかどうかを判断する方法はあり ますか?
- これらの場合のいずれかで、バッファが保持されているか、フロントバッファと交換されているか、またはめちゃくちゃになったかを判断する方法はありますか?
また、WGL、GLX、または EGL でどのように作成されているかについての情報もいただければ幸いです。特に質問 4 の回答が必要です。