私はOpenGLゲームを開発していますが、似たような機能を持つコードの一部をコピーし、新機能でコードを部分的に修正しましたが、まだバグがあります。このコードは、無効なデータとパラメータを使用してOpenGLレンダリング関数を呼び出します。
無効なデータ/パラメータでOpenGL関数を呼び出した後、システム全体が停止し、コンソールに切り替えることもできませんCtrlAltF1。
Linuxは安定したソフトウェア/オペレーティングシステムと見なされるので、残念です。次に、欠陥のあるOpenGLプログラムがシステム全体にクラッシュするのはなぜですか?
答え1
Linuxカーネルの「モノリシック」特性を考慮すると、CPUの最高の特権レベルで実行されるコードで発生するバグ(しばしば「カーネルモード」と呼ばれる)できるシステム全体をひざまずきます。
3つの理由があります:
- これらのコードは他のコードのメモリ空間に直接アクセスできます。したがって、これらのコードはカーネル自体を破壊し、ドライバなどを実行する可能性があります。
- これらのコードはI / Oデバイスに直接アクセスできます。 I / Oデバイスを誤って設定したり、間違った時間に誤ったビットを設定したりすると、システム全体がロックされる可能性があります。バグのないデバイスドライバは、ユーザーコードがハードウェアにシステムの不安定性を引き起こす可能性がある操作を実行することを許可しませんが、バグがある、ベータイ、または誤って書かれた(またはバグがある)ドライバはそうすることができます。
- 処理できない問題や例外が発生したコードには、より高いレベルの「スロー」はありません。その結果、カーネル例外がシステムクラッシュを引き起こす可能性があります。
それで、カーネルやグラフィックドライバでOpenGLがどのようにうまくいくのかわかりませんが、これが役に立つことを願っています。
答え2
最新のユーザーインターフェイス環境(Windows、OSX、Linux、モバイルデバイスなど)は、グラフィックパイプラインのパフォーマンスに大きく依存しています。
システムに**グラフィックパイプラインがあります。すべてのグラフィックプログラム(デスクトップ、ブラウザ、ゲームなど)は別々のスレッドであり、この単一のグラフィックコンテキストを共有する必要があります。
これはマルチスレッド問題に必要な条件を作成します。スレッドは、デッドロック、ライブロック、競合などのために困難になる可能性があります。
あなたのスレッドがデスクトップグラフィックススレッドと「うまく動作しない」ため、動作が中断される可能性があります。使用できなくなったリソースを待っている可能性があります(すべてのリソースを正しくリリースしましたか?)。
OpenGLは非常に積極的に開発され、ハードウェアを限界まで押し出しました。他のハードウェアではエラーが発生しないことを確認できます。
ただし、システム全体がシャットダウンすると、パイプの実際のチップセットが過熱または過圧になる可能性があります。ほとんどのハードウェアには、有害な負荷急増が発生した場合に電源を遮断するセンサーがあります。メーカーはハードウェア負荷テストを行い、それに応じてカットオフを設定します。
**単一のグラフィックパイプラインは、複数のパイプライン(画面の独立した小さな領域を「所有」できる)に置き換えられています。これがまさにOpenGLです。ブルカヌスこれは真であり、特別なGPUチップセットが必要です。