2012-04-29 15 views
-3

私はプログラミングが初めてです。私はC/C++とWin32の基礎を知っています。私は今、グラフィックをやろうとしていますが、私は画面への最速の接続を望んでいます。 OpenGLやDirectXを使っている人がほとんどです。しかし、私はオーバーヘッドを望んでいません。最初から始め、ピクセルデータをコントロールしたいと思います。私はGDIビットマップについて知っていますが、これがデータへの最適なアクセスであるかどうかはわかりません。私は窓を通って話をしなければならないことを知っています。それは問題です。 OpenGLとDirectXはGDIのレベルまでコンパイルされているのですか、それとも特別なやり方がありますか、バイパスしたり、同様のコードを使用していますか?どうして私がこれをしたいのか尋ねないでください。たぶん、これがどのように行われているかの説明が役に立つかもしれません。ウィンドウがすべてのウィンドウを結合して最終的なイメージを作成する方法と同様です。Windows低レベルのグラフィックス

+10

A「私のコンピュータやOSはどのように動作するのかわかりませんが、問題を解決したくない方法をすべて決めました。なぜ効率的な方法を排除したのか尋ねないでください" 質問。それらは最高です – jalf

+0

あなたはnvidia GPUのためにnvapiを使うことができます...ドキュメントを参照してください。 https://developer.nvidia.com/nvapi –

答えて

6

ピクセルデータへの最も直接的なアクセスは、OpenGLとDirect3Dの両方によってサポートされているシェーダ経由です。それらはクロスコンパイルされ、ビデオカード上で直接実行されます。彼らはOpenGLを使用せず、OpenGLのオーバーヘッドを持っていません。 OpenGLは、最初にグラフィックカードの専用プロセッサにそれらを取り込むために使用されます。

CPUで行うことは、まずバス(通常はPCI-express)を介してビデオカードにコピーする必要があります。 GDIは実際にグラフィックスメモリから多くのレベルが削除されています。

OpenGL、Direct3D、Direct2D、GDI、およびGDI +はすべて抽象レイヤーです。 GPUベンダは、これらの標準コマンド機能を受け入れ、カード固有のフォーマットでデータを再エンコードし、それをカードに送信するドライバを作成します。一般に、OpenGLとDirect3Dは最も大きく最適化されており、必要最小限の再エンコーディングしか必要としません。

どのようにWindowsがフルスクリーンイメージを作成するためにさまざまなオンスクリーンウィンドウを組み合わせるかは、あなたが話しているWindowsのバージョンによって大きく異なります。 DWMはすべてをに変更しました。 VistaではDWMが導入されて以来、プログラムはGPUメモリの個人領域にレンダリングされ、その後、ウィンドウマネージャはビデオカードのテクスチャルックアップユニットを使用して、各プログラムの個々の領域を画面のプライマリバッファに効率的にレイヤーします。プログラム(通常はゲーム)が全画面排他アクセスを要求すると、このステップはスキップされ、ドライバはそのアプリケーションからの描画コマンドを主スクリーンバッファに直接影響させます。

CPUが表示する必要のあるデータを生成していると仮定すると、最も高速かつ効率的なアプローチは、そのデータを頂点バッファオブジェクトにブロックコピーし、OpenGLコマンドを使用してラインまたはポリゴンとしてラスタライズするか、何でも(またはDirect3Dの同等のもの)。これまでGDIが低レベルのインターフェースであると思っていた場合は、先に読んだことがあります。しかし、それは純粋なGDIよりも数桁も高速に動作します。 GDI(とWPF)は、Direct2DやDirect3Dの上に構築されているということです。

+0

ありがとうございました。もう一つ質問があります。自分の考え方が正しいかどうかはわかりませんが、GPUはそのような操作の処理を増やすためのアドオンだと私は考えていました。そして、マザーボードの別のビデオカード部分がスクリーンに接続していました。私のラップトップのように、Nvidiaカードがあります。そして私はCPU - > GPU - >統合ビデオカード - > Screenと思って、GPUをバイパスしてアドオンにすることができました。私はしたくない。私はCUDAにオプトだけをコミットすることも考えています。並列性。すべてがnvidiaを通過し、画面を直接制御しますか? – user1364455

+0

@ user1364455:GPUはビデオカードの一部です。ハイブリッドシステムでは、私が書いたものほど良くはありません。描画はGPU上で行われ、フレームバッファは統合されたグラフィックにコピーされて画面にストリーミングされます。グラフィックスが非常にシンプルでない限り、統合グラフィックスを使用するよりも高速であり、CPUを使用してイメージを生成するよりもはるかに電力効率が高いです。とにかく、あなたはあなたのnvidiaチップを無視することができます - 私が書いたものはIntelの統合グラフィックスにも当てはまります。新しいIntelチップ(Sandy Bridgeのような)は統合されたグラフィックスのシェーダーをサポートします。 –

+0

@ user1364455:現代のコンピュータでは、画面上にデータを提供するグラフィックメモリに直接接続されたプロセッサ上で実行されるコードがあり、そのプロセッサはCPUではありません。 –

1

は、私は、私はあなたが不可能のために求めているピクセルデータ

をゼロからスタートし、制御したい画面

への最速の接続をしたいです。 GPUアクセラレーション機能を使用すると、最高のパフォーマンスが得られます。ただし、この場合、ピクセルデータに直接アクセスすることはできません。そのデータにアクセスしようとすると、システムメモリからビデオメモリにデータを転送する必要があるため、パフォーマンスに悪影響を及ぼします。その結果、システムメモリからビデオメモリにストリーミングされているものは注意深く処理する必要があります。さらに、APIを勉強しなければなりません。

「最初から始めて」CPUでレンダリングすると、ピクセルデータに簡単にアクセスでき、レンダリングを完全に制御できますが、パフォーマンスはGPUより劣ります(CPUは並列処理にはあまり適していません)。システムメモリはビデオメモリよりも桁違いに遅くなる可能性があります)、ホイールを再設計するためにかなりの時間を費やします。

OpenGLとDirectXはGDIのレベルまでコンパイルするのですか、それとも特別なやり方ですか?バイパスしたり、同様のコードを使用していますか?

いいえハードウェアの製造元が提供するドライバを使用してほぼ直接グラフィックハードウェアと通信します。また、DirectX/OpenGLで使用される「ダイレクトハードウェアアクセス」インターフェイスは、ハードウェア固有で製造元固有のものであり、内部でも、場合によっては特許で保護されているものでも使用できません。

利用可能なレガシーハードウェアインターフェイス(VESAまたはVGA 13hモード)はほとんどありませんが、通常は直接オペレーティングシステムでは使用できません(WindowsではVESAに簡単にアクセスできない)それらにアクセスするには、MS-DOSを起動するか、カスタムオペレーティングシステムを使用するか、ルート特権の下でしか機能しないヘルパークラス(linuxのSVGAlibなど)を使用する必要があります。もちろん、実際にVESA/VGAを使って何かをレンダリングしても、ハードウェア(RivaTNT 2 Proより新しいもの)でのパフォーマンスは、OpenGL/DirectXによるハードウェアアクセラレーションによるレンダリングと比べて恐ろしいものになります。適切なGPUドライバを持っていないときにWindows XPがどのくらい速く動作するかを見たことがありますか?直接VESA/VGAアクセスで動作する速度はそれほど速いです。

私がこれをやりたい理由を尋ねないでください。

なぜそれをしたいと思うのでしょうか。あなたの「私は直接的な低レベルのアクセスを望んでいます」というアプローチは、おそらく15..20年前またはDOS時代に適していました。現時点で合理的な解決策は、既存のAPI(あなた以外の誰かによって維持管理されているAPI)を使用して、完全に活用する方法を探し出すことです。もちろん、ドライバーを開発したければ、それは別の話になります。

0

は、DO OpenGLとDirectXは、GDIのレベルまでコンパイルするか、彼らはそれを行う特別な方法

私はほとんどのは、OpenGLやDirectXので行っている実感があります。しかし、私はオーバーヘッド

をしたくないので、あなたが言っているものですが**あなたは、OpenGLやDirectXが実際に何をすべきか全く見当もつかないし、まだあなたは彼らがあなたのために十分に効率的ではないことを決めましたニーズ。

申し訳ありませんが、これはナンセンスです。そのような質問に答えることは不可能です。

現実世界では、グラフィックを行うために専用の小さなスーパーコンピュータがあります。 OpenGLとDirectXを使ってアクセスできます。

そして、彼らが高速である理由は、NOTちょうど "ゼロから始まり、ピクセルデータを制御する"ということです。

深刻な回答が必要な場合は、知識のある方に質問に回答させて、どの質問が最適かを判断してください。

効率的なグラフィックスが必要な場合、正解はDirectXまたはOpenGLを使用することです。

関連する問題