私はプログラミングが初めてです。私は C/C++ と Win32 の基本を知っています。現在、グラフィックスを実行しようとしていますが、画面への最速の接続が必要です。ほとんどが Opengl または DirectX を使用していることに気づきました。しかし、私はオーバーヘッドを望んでいません。ゼロから始めて、ピクセルデータを制御したい。GDI ビットマップについては知っていますが、これがデータへの最適なアクセスかどうかはわかりません。私は窓越しに話さなければならないことを知っていますが、それが面倒です。Opengl と DirectX は GDI のレベルまでコンパイルされますか、それとも特別な方法がありますか?類似のコードをバイパスまたは使用しますか? なぜ私がこれをやりたいのか聞かないでください。これがどのように行われるかの説明が役立つかもしれません。ウィンドウがすべてのウィンドウを結合して最終的なイメージを作成する方法と同様です。
3 に答える
The most direct access to pixel data is via shaders, which are supported by both OpenGL and Direct3D. They are cross-compiled and run directly on the video card. They do not use OpenGL, they do not have OpenGL overhead. OpenGL is just used to get them to the graphics card's own processor in the first place.
Anything you do on the CPU has to first be copied across the bus (typically PCI-express) to the video card. GDI is actually many levels removed from the graphics memory.
OpenGL, Direct3D, Direct2D, GDI, and GDI+ are all abstraction layers. The GPU vendor writes a driver that accepts these standard command functions, re-encodes the data in the card-specific format, then sends it to the card. Typically OpenGL and Direct3D are the most heavily optimized and also require the least amount of re-encoding.
How Windows combines the various on-screen windows to create the full-screen image depends heavily on what version of Windows you are talking about. DWM changed everything. Since DWM was introduced in Vista, programs render to their personal areas of GPU memory, then the window manager uses the texture lookup units of the video card to efficiently layer each of the programs' individual areas onto the screen primary buffer. When a program (usually a game) requests full-screen exclusive access, this step is skipped and the driver causes rendering commands from that application to affect the primary screen buffer directly.
Assuming that the CPU is generating the data which needs to be displayed, the fastest and most efficient approach is likely to be block-copying that data into a vertex buffer object and using OpenGL commands to rasterize it as lines or polygons or whatever (or the Direct3D equivalent). If you previously thought that GDI was the low-level interface, you've got some reading ahead of you to make this work. But it will run several orders of magnitude faster than pure GDI. So much faster, in fact, that the new architecture is that GDI (and WPF) is built on top of Direct2D and/or Direct3D.
しかし、画面への最速の接続が必要です
ゼロから始めて、ピクセルデータを制御したい
あなたは不可能を求めています。GPU で高速化された関数を使用すると、最高のパフォーマンスが得られます。ただし、この場合、ピクセル データに直接アクセスすることはできず、システム メモリからビデオ メモリにデータを転送する必要があるため、ピクセル データにアクセスしようとすると (読み戻しまたは書き込み)、パフォーマンスに悪影響を及ぼします。その結果、システム メモリからビデオ メモリにストリーミングされるものはすべて注意して取り扱う必要があります。さらに、API を勉強する必要があります。
「ゼロから始めて」CPU でレンダリングを行うと、ピクセル データに簡単にアクセスでき、レンダリングを完全に制御できますが、パフォーマンスは GPU よりも劣ります (CPU は並列処理にはあまり適しておらず、システム メモリが不足する可能性があります)。ビデオ メモリより桁違いに遅い)、さらに車輪の再発明にかなりの時間を費やすことになります。
Opengl と DirectX は GDI のレベルまでコンパイルされますか、それとも特別な方法がありますか?類似のコードをバイパスまたは使用しますか?
いいえ。ハードウェア メーカーが提供するドライバーを使用して、グラフィック ハードウェアとほぼ直接通信します。また、DirectX/OpenGL で使用される「直接ハードウェア アクセス」インターフェイスは使用できません。これらはハードウェア固有およびメーカー固有であり、内部にある可能性があり、特許によって保護されている可能性さえあります。
もちろん、利用可能なレガシー ハードウェア インターフェイス (VESA または VGA 13h モード) はほとんどありませんが、通常、それらを直接使用することはオペレーティング システムによって禁止されています (Windows で VESA に簡単にアクセスすることはできません)。 MS-DOS を起動するか、カスタム オペレーティング システムを使用するか、root 権限でのみ機能するヘルパー クラス (Linux の SVGAlib など) を使用する必要があります。もちろん、実際に VESA/VGA を使用して自分で何かをレンダリングしたとしても、どのハードウェア (RivaTNT 2 Pro よりも新しいもの) でも、OpenGL/DirectX によるハードウェア アクセラレーションによるレンダリングと比較すると、パフォーマンスはひどいものになります。適切な GPU ドライバーがない (ウィンドウの再描画に 1 秒かかる) Windows XP の動作速度を見たことがありますか? これは、直接 VESA/VGA アクセスで動作する速度です。
なぜ私がこれをやりたいのか聞かないでください。
なぜそれをしたいのかを尋ねるのは理にかなっています。あなたの「直接の低レベルアクセスが欲しい」というアプローチは、おそらく15..20年前またはDOS時代に適していました。現時点での合理的な解決策は、既存の API (あなたではない誰かによって維持されている) を使用し、それを十分に活用する方法を探すことです。もちろん、ドライバーを育成したいのであれば話は別です。
Opengl と DirectX は GDI のレベルまでコンパイルしますか、それとも特別な方法がありますか
と
ほとんどが Opengl または DirectX を使用していることに気づきました。しかし、私はオーバーヘッドを望んでいません
つまり、**あなたは OpenGL や DirectX が実際に何をするのかまったくわからないのに、ニーズに対して十分に効率的ではないと判断したということです。
申し訳ありませんが、これはナンセンスです。そのような質問に答えることは不可能です。
現実の世界では、グラフィック専用の小さなスーパーコンピューターがあります。そして、OpenGL と DirectX を介してアクセスできます。
そして、それらが速い理由は、「ゼロから始めてピクセルデータを制御する」だけではないからです。
ですから、真剣な回答が必要な場合は、あなたの質問に答える知識のある人に、どの質問が最適かを判断してもらいましょう.
効率的なグラフィックが必要な場合の正解は、DirectX または OpenGL を使用することです。