ゲームでピクセルを直接描画できるのに、OpenGLやDirectXなどのグラフィックフレームワークがあるのはなぜですか?


16

ゲームやその他のグラフィックを多用するアプリケーションは、OpenGLやDirectXなどのフレームワークを使用します。また、ピクセルシェーダーやDX12などの機能が必要です。

しかし、ピクセル単位ですべてを描画できるのに、なぜこれらすべてのフレームワークとGPU機能が必要なのでしょうか?

まず、ゲームはピクセル単位で描画されるようにコンパイルする必要があります。これにより、ゲームの実行可能サイズが大きくなる可能性がありますが、より高速で、32ビットカラーGPU(古いものでも)で動作しますか?

最初の3Dゲームはピクセルごとに描かれたのは知っていますが、なぜ今はそうしていないのですか?


一般に、多くの事柄に対して1つの操作を行うことは、すべての事柄に対して個別に行うよりも効率的であり、考えるのが簡単です。
user541686

2
すべてのゲームは、すべてのグラフィックカードに対して書き換える必要があるためです。グラフィックカードを使用しなかった場合を除き、その場合は遅くなります。
-user253751

私は、GPUの企業は、独自のDirectXドライバを作成するために持っていると思う
Suiciドーガ

1
「しかし、ピクセル単位ですべてを描画できるのに、なぜこれらすべてのフレームワークとGPU機能が必要なのでしょうか?」それが昔やり方です。Wolfenstein 3D、Doom、Duke Nukem 3D、Quake、および90年代後半の他のほとんどのゲームは、純粋なソフトウェアレンダリングを使用していました(QuakeはオプションとしてOpenGLレンダラーを提供していました)。
el.pescado

1
@MatthewRock役に立たない 確かに、OSをdockerコンテナー内のゲームにバンドルして、コンテナーを配布できます。そうすれば、ユーザーはディストリビューションのためにライブラリの依存関係をインストールする必要がありません。
ナビン

回答:


23

速度は、これが行われない最も一般的な理由です。実際、あなたが提案したことをすることができます。もしあなたがあなた自身のオペレーティングシステムを作るなら、それは単にアーキテクチャ上の理由で非常に遅くなるでしょう。そのため、高速であるという仮定には少し欠陥があります。たとえそれがより高速であっても、開発の点では効率が低下します(作業の10倍で1%の速度向上など)。

CPUからグラフィックカードへのデータのコピーは、比較的遅い操作です。コピーが少ないほど、更新速度は速くなります。そのため、理想的には、GPUにほとんどのデータを保持し、小さなデータの塊のみを更新します。1920x1200以上と比較して320x200ピクセルを超えるコピーには世界の違いがあります。更新する必要があるピクセル数が、辺が大きくなると二次的に大きくなることを確認してください。

例:GPUに画像を10ピクセル右に移動するように指示する方が、ピクセルを別の場所のビデオメモリに手動でコピーするよりも安価です。

なぜAPIをたどる必要があるのですか?それはあなたのシステムではないからです。オペレーティングシステムでは、安全上の理由から、必要な操作を実行できません。第二に、オペレーティングシステムはハードウェアを抽象化する必要があるため、OSでさえ抽象化されたシステム(必要に応じてAPI)を介してドライバーと通信します。

実際、すべての作業を自分で行った場合、ほぼゼロに近い場合、システムが高速になる可能性を評価します。Cとアセンブリを比較するようなものです。確かにアセンブリを記述できますが、最近のコンパイラはかなり賢く、常に最適化されています。たとえ生産性が低下しても、手動で改善するのは難しいです。

PS:APIは、古いゲームが行ったように、この更新を不可能にすることはありません。それだけで非効率です。APIのマインドが原因ではなく、非効率的な期間であるためです。

PPS:これが、彼らがVulkanを展開している理由です。


6
See the number of pixels you need to update grows exponetially when the sides grow.二次的に、私は思う。
クトゥルフ

「CPUからグラフィックカードへのデータのコピーは、比較的遅い操作です。」これは事実ですが、無関係です。60 fpsで数百万ピクセルを超えるコピーは、控えめなPCI-Eリンクでも簡単に達成できます(1秒あたり数百メガバイトしか必要ありません)。
コクシー

2
@ pjc50それは間違いではありませんが、正確ではありません。GPUは、大量のデータに対して単一のプログラム(通常はシェーダー)を並行して実行するように特化されています。そのため、GPUの計算能力を実際に使用するには、多くのデータに対して同じ操作を実行する必要があります。プログラムが動作しない場合は、CPUでプログラムを実行する方が適切です。
ネロ

2
バツ22バツ

1
あなたはコピーと移動について話しますが、より重要なのは実際の画像生成です。どのオブジェクトがどのポイントで見えるか、どのように点灯するか、煙の効果などを決定する必要があります。GPUはこれらの操作を高速かつ並行して実行するために高度に最適化されています。APIを使用すると、一般的な操作を簡単に表現できます。
-IMil

15

32ビットカラーGPU(古いものでも)で動作しますか?

ここで少し歴史があります:これは、90年代半ばにグラフィカルアクセラレータが利用可能になるまでPCでゲームが行われた方法です。ハードウェアがあまり機能していないため、実際にすべてのハードウェアで動作しました。

グラフィカルアクセラレータを使用すると、専用のハードウェアと並列処理を使用することで、CPU よりもかなり高速にピクセルを描画できます。アクセラレータには、多数のプロセッサコアが含まれています。デスクトップPCには、年齢に応じて1〜8個のコアがあります。私のGTX970Tiグラフィックカードには1664(1千664の!)コアがあります。これは明らかに、生の速度でPCをはるかに凌いでいます。

ただし、アクセラレータは標準化されておらず、多くの場合、速度を上げるために奇妙なコンピューターアーキテクチャのトリックが含まれています。カードの特定のメーカーやモデルに合わせてカスタマイズされていないゲームを作成するには、APIが存在する必要があります。そして、それがDirectX、GL、シェーダー言語の使用目的です。実際、シェーダーの作成、ピクセルを直接描画するプログラムを作成するのに最も近いものです。カードがピクセルごとに1つずつ、そのプログラムのコピーを1000個並行して実行するだけです。


私のタブレットが192ありながら、私のラップトップのAPUは686MHZ @ 256個のシェーダーコアを持っている
Suiciドーガ

ねえ、タイタンXには5760個のコアがあります。
ダニエル

@Danielは<超高【選択タイタンXで30fpsのは非常に強力なタイタンXが行くことにどんなゲームがありです
Suiciドーガ

うーん、これらのいずれか、おそらく:maximumpc.com/10-most-graphically-demanding-pc-games
Daniel

@ダニエルそれらのゲームの開発者は、約2-4枚のTitan Xカードを持っている必要があります:)
Suici Doga

14

joojaaの答えに追加するために、物事まだピクセルごとに描かれています。頂点シェーダー/アセンブラー/ラスタライザーを使用してピクセルを生成し、フラグメントシェーダーを使用してそれらをテクスチャリングおよび照明するだけです。これは、ビデオカードがブリッターとフレームバッファー以上のものではなかった90年代にソフトウェアですべて行われましたが、非常に遅いものでした。したがって、最新のGPUの発明。

行われている描画の数学は、Doom時代に戻ったときと基本的には同じですが、現在では少数のCPUコアではなく、数百/数千のシェーダーALUで実行されています。APIは、基本的に舞台裏で同じGPU命令セットにマップされます。それらは、複数のベンダープラットフォームに渡って大量の厄介なGPUアセンブリを記述する必要をなくすためにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.