次の 3D グラフィックスを多用するアプリケーション (3D モデリングおよびアニメーション ソフトウェアなど) を C# で作成する場合、どれを選択するのが適切でしょうか?
C# をプラットフォームに依存しないと考えると、OpenGL は魅力的に見えますが、パフォーマンスなどはどうでしょうか?
使用言語は C# なので、パフォーマンスは非常に重要です。
編集: SlimDX と TAO、OpenTK、csGL なども検討できます。
次の理由から、OpenGL をお勧めします。
とはいえ、どちらのアプローチも確実な実装であるため、システムの要件と個人的な好みによってどちらの方向にも傾く可能性があります. 欠点としては、OpenGL は非常にステート マシンであり、OO に適合させるのは難しい場合がありますが、不可能ではないことは確かです。
編集: OpenGL シェーダー モデルが本質的に DirectX よりも優れているという私のコメントを明確にするために追加されました。これは、DirectX シェーダーが汎用 GPU モデルに対して開発時にプログラムでコンパイルされるのに対し、OpenGL シェーダーはソース コードとして保持され、実行時に OpenGL ドライバーによってコンパイルされるためです。したがって、理論的には、ドライバー ライターが GPU の特定の (または古いプログラムの実行時に更新された) 機能を利用して、DirectX シェーダーよりも高速に実行できるコンパイル済みコードを作成することが可能です。小さなポイントですが、潜在的に非常に重要なポイントです。
Direct3D と OpenGL のパフォーマンスの差はほとんどありません。2 つの機能セットは 1 対 1 ではありませんが、近いものです。OpenGL の主な利点は、クロス プラットフォームのサポートです。
グラフィックサブシステムに関して、マネージコードのパフォーマンスは悪くありません。SlimDXは、DirectXを呼び出すたびに、完全にネイティブなコードに対してわずかなペナルティを支払いますが、決して深刻ではありません。実際のペナルティは呼び出しによって異なります。DrawPrimitiveへの呼び出しは、SetRenderStateへの呼び出しよりも全体的にはるかにコストがかかるため、パーセンテージ的には、SetRenderState呼び出しでより多くの損失を被ることになります。SlimDXには、少し注意する必要がありますが、一般的に非常に優れたパフォーマンスを発揮する調整済みの数学ライブラリが組み込まれています。プロファイリングは、NProfのようなジャンカーツールを使用しても、このようなものを非常にすばやく強調表示するため、修正するのは難しくありません。
全体として、D3Dを介してレンダリングを行う一般的な完全に最適なC ++およびC#コードを検討すると、C#バージョンはおそらくC ++バージョンの10〜15%以内です。しかし、それを達成するのは難しいです。C#で作業することでどれだけの時間を節約できるかを検討してください。これは、C ++ですべてを構築する必要がある場合は、おそらく時間のない高レベルのグラフィック最適化に適用できます。また、C ++でさらに10%を取得できたとしても、ハードウェアの新しいラウンドがこれまでになく速くアプリケーションコードを破壊すると、数か月以内に5%にすぐに縮小します。私は自分が何を選ぶかを知っています-それが私が最初にSlimDXを書いた理由です。
OpenTKは同様のパフォーマンス特性の影響を受けますが、数学ライブラリが場所によってはかなり遅いという警告があります。これは私が彼らと話し合った実装のバグであり、まもなく修正されることを願っています。
OpenGL はパフォーマンス機能に関して過去に遅れをとっていましたが、最終的には修正されました。例を挙げると、OpenGL が同様のメカニズムを取得する前に、Direct3D がより高速なメカニズムを持っていたバインド可能なユニフォームを考えてみましょう。時々異なる機能セットをサポートすることを除けば、違いはありません。
そのため、最新の GPU 機能を使用するつもりがない限り、OpenGL を使用することをお勧めします。パフォーマンス関連の機能で OpenGL が遅れをとっている領域は多くないと言っても過言ではありません。
ところで、C# と .NET は、特定の予防措置を講じた場合にのみ、プラットフォームに依存しません。
これがあなたへの私の正直な提案です:両方を利用してください。
私は、プログラムを完成させるために使用できるツールがどちらが多いかを常に検討し、パフォーマンス上の理由から、異なるシステムで最大のパフォーマンスを確保するために、もう一方を使用します。
プログラムのパフォーマンスは、主にユーザーの労力 (アプリケーションのコード) と特定のコンピューターのドライバーに依存します。グラフィックス API は、アプリケーションが GPU と通信するための手段であるため、インストールされた GPU に対して特定のドライバーがどれだけうまく実装されているかに大きく依存します。
一部のグラフィック カードでは、Direct3D が OpenGL よりも高速な場合があります。これは、グラフィック ベンダーとそのドライバーによるものです。
DirectX には、開発をスピードアップするためのツールが多数用意されています。最初は非常に急な学習曲線があることは承知していますが、たまたまプログラマーであることを思い出してください。私はあえて非常に良いことさえ言います。
したがって、両方の API を利用する独自のフレームワークをゆっくりと開発し、考えているプログラムをテストして実装できるようにする必要があります。
心から、
モサ・ノヴァ・メルヒ
XNA が気に入らない場合は、SlimDXを使用できます。XNA とは異なり、SlimDX は DirectX 10 をサポートします。
OpenGL と DirectX の両方を使用しました。性能はかなり似ていると思います。私は、OpenGL のプログラミング モデルを好みます。特に、変換の処理とピッキング操作の直接サポートです。私は、MS が OS をアップグレードするたびに同じ機能を再ラップし続ける方法が嫌いであり、OpenGL がそれからあなたを守ってくれると思います。
ただし、どちらも風変わりであり、Windows であろうと他のものであろうと、ホスティング アプリケーション フレームワークと適切に相互作用することを確認するには、かなりの時間を費やす必要があります。
おそらくIrrLichtエンジンを調べたいと思うでしょう。これは、C++と.NetAPIの両方を備えており、完全にグラフィックスAPIに依存しません(つまり、同じコードを使用してOpenGLまたはDirectXを実行でき、プログラマーはどちらを使用するかを知る必要がありません。使っている)
また、XNAに代わる非常に高速で軽量なオープンソースのSlimDXも検討することをお勧めします。
OpenGL は、XNA のようなものほど純粋な OO 環境に適合するとは思えません。とはいえ、クロスプラットフォームの互換性を本当に気にするのであれば、バックエンドが何であっても問題ありません。
アプリケーションのビジネス ロジックがレンダリング バックエンドから独立するように設計します。OpenGL レンダリング オブジェクトをプラグインして、XNA レンダラーに問題なく交換できるはずです。これにより、(両方のサポートを有効にすることで) 潜在的な顧客ベースが増えるだけでなく、アプリケーションの設計がはるかに優れたものになります。
また、Managed DirectX は廃止されたため、.NET から DX を使用しないでください。XNA を使用します。
DirectX は、MSFT がカードの認証に使用するものであるため、Windows でのビデオ ドライバーのサポートが向上する予定です。Windows の安価なカードでは、OpenGL のサポートが不足している、クラッシュしている、または明らかに間違っていることがわかりました。
対象とするプラットフォームによって異なります。
ウィンドウをターゲットにするだけでよい場合は、XNA を使用します。
クロスプラットフォームの作業については、他の誰かが openGL で mono を使用していくつかの作業を行っている可能性があります。ゲームではなくグラフィック ソフトウェアを作成するつもりであると想定しているため、winForms のような何らかのフレームワークを使用すると、すべての作業に非常に役立ちます。 UI コントロール。
これを見たいと思うかもしれません: http://groups.google.com/group/microsoft.public.win32.programmer.directx.managed/browse_thread/thread/1fc097147796e15b
マネージ API は現在サポートされていないため、XNA を使用する場合を除き、OpenGL が最善の策かもしれません。
モバイル デバイスや XBox360 など、サポートしたい他のプラットフォームに応じて、使用する API を決定するのに役立ちます。
パフォーマンスに関しては、どちらも実質的に同じであり、コードとデザインが速度に影響を与える主要な要因になります。さらに、両方の API が適切に管理されています (dx がはるかに進んでいた 5 年前と比較して)。
この場合、1 つのオプションは、自分の哲学と各 API の背後にある哲学に基づいて選択することです。
商業的な焦点が必要な場合もあります。ソフトウェアを販売し、お金を反転させ、ビジネスを行います。お金で物事をスピードアップできるビジネス環境から来たdxは、とりわけ、キャパシティーションや開発ツールでマイクロソフトとの興味深い取引を得ることができるこのケースに適している可能性があります。
一方、OpenGLはオープン スタンダードです。これは、人々が議論/評価し、標準 API の改善に貢献できることを意味し、そもそも社会の利益になることが保証されています。これは、研究の公開、フリー ソフトウェアのリリース、コミュニティの作成、世界中の開発者からのフィードバックの取得、マルチプラットフォームなどの科学的アプローチとより互換性があります。
それらはソフトウェアの進化に対する異なる見方です。どちらにも長所があると思います。非常に異なるバックグラウンドから来た 2 つの API から選択できるのは良いことですが、非常に類似したことを行います。
DirectX 用のマネージ API があり、「ネイティブ」C# オブジェクトとして DirectX API にアクセスできます。これは、OpenGL に対する大きな前進です。