フレームワーク(XNA)とAPI(DX)はどこで始まりますか?


7

XNA対OpenTK対SlimDX対OpenGL対DXについて尋ねる多くの興味深い質問を読みました。これらのさまざまなAPI /フレームワークを使用して数百時間から他の一般的な印象を得るのは本当に便利ですが、私はしていませんそれぞれの範囲が何であるかを明確に定義する答えを見た。

API、エンジン、フレームワークの違いは理論的には何であるかは理解していますが、グラフィックスシステムの経験が限られている人にとっては、実用的な側面で何が各カテゴリに分類されるかを理解するのは困難です。(すべてのオーバーラップによって簡単にはなりません!たとえば、XNAがコンテンツパイプラインを不可欠な部分として実装しています)

たとえば、顔カリングを考えてみてください。XNAは、プログラマが考える必要なく、これをバックグラウンドで「実行」しますが、どこで発生するのでしょうか。呼び出す必要があるDXの「カルフェース」関数、またはおそらくXNAの上の関数がありますか?または、GPUまたはそのドライバーはそれを行いますか?

効率的なレンダリングコードを実装することがいかに困難であったか、およびそのプロジェクトがどのように抽象化したかについて、管理されたプロジェクトの1つに関するドキュメントを読みました(不愉快なことに私は覚えていません)。これは私を少し不安にさせ、フレームワークがより柔軟なもののために残された場合に手動で行わなければならないDrawIndexedPrimitivesの下でXNAが何をしているのか疑問に思いました。

XNA バックグラウンドで何を行うのでしょうか。そのキューブをレンダリングするとき、マネージAPIはそうしませんでしたか?


gamedev.stackexchange.com/questions/12701/…エンジンとフレームワークのパートを合計します。APIは、単純にそのフレームワーク/ライブラリ/エンジンの提示方法です。
共産主義者アヒル

例の顔カリングの質問以外は、この質問はかなりあいまいです。どのような答えを探していますか?どのレイヤーが何をしているのかを見分けることができるように、すべてのライブラリが行うすべてのリストを求めているようです。おそらく、関連するドキュメントと、可能な場合はソースコードをケースバイケースで参照する必要があると思います。あなたの顔カリングの質問には答えることができますが、カプセル化の残りの質問は私には自由回答のようです。
リケット

主な質問はタイトルにあると思います。OPは、XNAはC ++との直接Xでプログラミング対やっているどのくらいの「忙しい仕事」知りたいのですが
ネイト

@Ricket、申し訳ありませんが、答えを表現する最善の方法が正確にわからないため、少し漠然としています。レイヤーのリストに関しては、あなたは正しいです。膨大なリストではありませんが、XNAがバックグラウンドで呼び出す関数の種類のいくつかの例、またはOpenGLでのレンダリングに必要だがXNAではないメソッドは、レベルの違いがどれほど大きいかを示すのに適していますです。ネイトは正しいです。低レベルから来ている場合は、何が隠されているかをかなり簡単に確認できますが、XNAから始めた場合は、何が欠けているか(したがって、どれだけ高いか)を確認するのが難しくなります。
sebf

(私は質問を少し規範的になるように編集しました)@The Communist Duck、ありがとう、私はそのスレッドが役立つと思います-特にエンジンから分離されたゲームについてのあなたの最後の意見は、エンジンが本当に何であるかをよく示しています。
sebf

回答:


0

私はあなたがそれを逆にした方がいいでしょう。グラフィックカードはどのように機能し、これらの機能を利用するためにDirectXまたはOpenGLによってどのような呼び出しが行われますか?

これ自体はあなたの質問には答えませんが、DirectXとOpenGLが多くの上位レベルのクラスを追加して物事を簡略化するので、たとえばXNAが提供するものとの違いは曖昧すぎると思います。

基本については、DirectX / XNA呼び出しに類似点があります。これは、特定の(より低い)レベルでは、物事をより簡単に行うことはできず、呼び出しは自分で行う必要があるためです。

そこで、OpenGLでシンプルなレンダリングエンジンを作成して(レベルを下げるとアクセスしやすくなります)、どこに行くのか見てみましょう。


すべての間のコンセンサスが本質的に存在しないということである場合、答えを選ぶのは難しいですが、違いを理解する唯一の方法はSlimDXまたはOpenTKで遊ぶことです(私がアセンブリで始めたので、C#に甘やかされてきたので、まだGCなしでは行けないと思います;))、それを直接見てください。
sebf

1

フレームワークは基本的に、APIを提供します。多くの場合、これを行うために他のAPIを使用またはラップします。2つの用語は必ずしも異なるわけではなく、スコープに明確な違いはありません。違いを伝えることができることはそれほど重要ではありません。重要なのは、特定のAPI、ライブラリ、フレームワーク、エンジンの抽象化のレベルを知ることです。プラットフォーム、またはパッケージが動作します。これを見つけることは、残念ながらケースバイケースで異なります。


0

フレームワークが始まります... APIが終了します。APIは、使用できる機能/クラス/何でも制限されたセットであり、フレームワークはそれらすべてのものをラップするだけです。

あなたはどのくらい求めている場合のものあなたは本当に一般的なケースで釈明ではないことを、どのようなAPIメソッドの呼び出しに到達するために使用しているものは何でもフレームワークの機能をお使いの呼び出しの間に進みます。いくつかのことは簡単で、いくつかは本当に抽象化されており、知っておくと便利なものを隠している可能性があります(そのため、この質問をしていると仮定しています)。

特にXNAの場合、ILSpyなどのツールを使用してコードを表示し、XNA DLLを開いて、内部で何が行われているのかを確認できます。


私は.NET Reflectorを使用してDrawIndexedPrimitivesメソッドを確認しましたが、多くの点で役立ちましたが、他の点では不完全でした。一方では、ネイティブDXプログラマーがデバイスへのポインターを取得し、ハードコードされた定数でそ​​れにオフセットして関数ポインターを取得することによってジオメトリを描画し、これを呼び出すとは思わない(少なくとも、私は本当に望んでいない!:-o )。一方、DrawUserPrimitives関数は、少なくともその関数では、大量のエラーチェックを備えた単なるラッパーであり、XNAがそれ以上のことを行うことはありません。
sebf

私がリストした例の範囲がどれほど多様であるかを誤って推定している可能性があります。あなたとKylotanが言うように、確認する唯一の方法はマネージAPIを学ぶことです。
sebf

2
関数ポインターを取得するためのハードコードされた定数は、C ++ / CLIからの逆コンパイルの結果です。C ++ / CLIコンソールアプリを作成してネイティブのDirect3D APIを参照し、 'pDirect3DDevice-> EndScene();'のようなことをした場合 リフレクターでC#として表示すると、見たもの(または同様のもの)に逆コンパイルされます。多くのXNAはC#ではなくC ++ / CLIで記述されていると思います。
jeffora

@jeffora、それはもっと理にかなっています。ライブラリを開くときに、.NET Reflector自体がオンデマンドで逆コンパイルを行いますか?
sebf

RedGateのリフレクターは本質的にILを同等のマネージ言語にマッピングしています。言語を変更でき、ILのみを表示することもできます。表示されるソースコードは、入力された内容に対して常に正確であるとは限りません。これは、コンパイラが生成したものを正確に逆コンパイルしたものです。逆コンパイルされたXNAの一部からのC#コードは、自分で(C#で)作成しようとしてもコンパイルされません
jeffora
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.