4

で非常に高速にピクセル配列を描画するにはどうすればよいc++ですか?

私はstackoverflowでこのような質問をたくさん見てきましたが、
それらはすべて次のように答えられています:

  • gdi を使用する (Windows)
  • OpenGL を使用する
  • ...

しかし、openglがどのようにそれを行っているかという方法があるに違いありません!


私は小さなレイトレーサーを書いていて、すべてのピクセルを
毎秒何回も描画する必要があります。
opengl は、プラットフォームに依存せず高速でそれを行うことができるので、 opengl なし
でどのようにそれを達成できますか?

そして、「openglなし」は意味 しません

  • sdl を使用する (遅い)
  • この/あのライブラリを使う

プラットフォームのネイティブ メソッドまたはそれに最も近い ライブラリのみを提案してください。

可能であれば(私は知っています)
、どうすればこれを行うことができますか?
プラットフォームに依存しないソリューションが推奨されます。

4

2 に答える 2

4

Linux でグラフィックスを描画するには、X11 または OpenGL を使用する必要があります。(そして、近い将来、Wayland が別の選択肢になるかもしれません)。Linux カーネルはグラフィックス API を気にしないため、Linux ではグラフィックスを行う「ネイティブ」な方法はありません。これは、ユーザー空間に実装されるグラフィックス システムを使用するインターフェイス (DRM) を提供します。ウィンドウを気にせずに画面にピクセルをスプラットしたいだけなら、 /dev/fbdev を mmap することもできます – しかし、通常はそんなことはしたくありません。隠れる。

プロトコルのオーバーヘッドが原因で、使用する API に関係なく、単一のポイントを描画するのは非効率的です。

だからX11です。したがって、バッファ内のピクセルを変更するために使用する MIT-SHM 拡張機能を使用するのが最善の策です。これは、X11 サーバーによって全体がブリットされます。もちろん、純粋な X11 Xlib 関数を使用してこれを行うのは面倒です。これが、SDL が効果的にうまくまとめたものです。

もう 1 つのオプションは OpenGL です。OpenGL はライブラリではありません。これはシステム レベルの API であり、GPU にほぼ直接アクセスできます。また、X11 とうまく統合されます。はい、API は読み込まれるライブラリを通じて提供されますが、技術的には、そのライブラリは実際のドライバーへの「ラッパー」または「インターフェイス」にすぎません。OpenGL で単一点を描画しても意味がありません。ただし、(頂点配列を使用して) いくつかのポイントをリストに「バッチ処理」してから、そのリストを処理することができます。したがって、2 つの表示更新間隔の間にすべての着信ポイントを収集し、それらを 1 つのバッチで描画するという考え方です。

プラットフォームに依存しないソリューションが優先されます。

では、なぜネイティブAPI について質問しているのですか? 定義上、プラットフォームに依存しないネイティブ API はあり得ません。ネイティブか、プラットフォームに依存しないかのどちらかです。

そして、あなたの特定のシナリオでは、SDLが最適なソリューションになると思います.SDLは、レイトレーサーに最適な種類の抽象化とプログラム側のインターフェースを提供するからです. 参考までに: QEmu のような仮想マシンは SDL を使用します。

または、広くサポートされている真のプラットフォーム ニュートラル API である OpenGL を使用します。

于 2013-07-07T09:24:25.033 に答える