XNAおよびC#と360のインオーダープロセッサ


14

この暴言を読んで、私は彼らがおそらく正しいと感じています(キセノンとCELL BEはどちらも分岐キャッシュの無知なコードに非常に敏感であると見て)が、人々はC#でもゲームをうまく作っていると聞いています

それで、XNAでプロフェッショナルなことをすることは不可能なのは本当ですか、それともポスターがXNAをゲーム開発のキラーAPIにするものが欠けているだけですか?

専門家とは、お金を稼ぐことができるという意味ではありませんが、より専門的なゲームには、本質的なものに対する明確な障壁がある言語の範囲外にある物理モデルとアニメーションシステムがあるという意味です。ゲーム用にコリジョンシステムまたは流体力学エンジンを記述したい場合、ランタイムコードジェネレーターと組み込み関数の欠如がパフォーマンスを妨げるため、C#がそれを行う機会を提供するとは思わない。

しかし、多くの人々はこれらの制約の中でうまく働いているようで、ゲームを成功させていますが、見落としによって問題を避けているようです。XNAゲームが、ライブラリによって既に提供されているもの、またはシェーダーによって処理されているもの以外の複雑な処理を行うことに気付いていません。これは、C#の制限のために、より複雑なゲームダイナミクスを回避したのでしょうか、それとも、人々がそれを成し遂げることに専念しているのでしょうか?

正直なところ、AI戦争がデータ指向のアプローチや標準的なアプローチよりも優れた実行を実現するための汚いC​​#ハッキングなしでAIの多くのユニットを維持できるとは信じられません。人々がC#をハッキングして、C ++でゲームコーダーが自然にできることをできるようにしましたか?


さすがに。男にすべての情報を見つけ、私がこれまでにバックアップする触知できるあらゆる種類の情報を見てみたいと思いますスタートアップ、...彼らにしている(彼のですが?)見ていない
ジョナサン・コネル

理由から、スタジオがXNAの使用を認めていないように思えます。ただし、ここにリンク
トリスタンワーナースミス

それをバックアップするための明らかな情報は、CPUが分岐コードがかなり本質的に悪いという事実です。これはC#です。私が知りたいのは、プロのXNAユーザーがC#によって課されたソフト制限に達していないことを意味していることは何ですか?
リチャードファビアン

3
反対票を理解できません
...-FxIII

3
リンクされた記事の(多数の)技術的ミスと、「金makeけ」ではなく「ハローレベルの生産」を意味する「プロフェッショナル」という言葉を無視している人が多いため、多くの人がリチャードの質問を否定しています。後者は適切な選択ではありませんが、リンクに同意しないという理由だけでダウン票を投じないでください-代わりに答えることでそれをデバンクします。

回答:


21

OK、リンクした暴言にいくつか穴を開けるだけです:

  • 「C#は「Just In Time」インタープリターに依存しています -間違っています-JIT コンパイラーです。メソッドが一度 JITtedされ後、コンパイルされたコードは各呼び出しで再利用されます。コンパイルされたコードは、ネイティブのプリコンパイルされたコードと非常に高速です。
  • 「キセノンCPUは「インプレース」プロセッサーです」 -「インオーダー」という意味ですか?-そして、「Xenon CPUには分岐予測がありません」。彼は、これらの意味は、JITコンパイルが自然にCPUによって並べ替えられなければならない悪いコードを生成し、大量の分岐を引き起こすことを意味することを意味します-これは絶対にナンセンスです。このCPUアーキテクチャで実行する場合のパフォーマンスに関する同じアドバイスは、C ++とC#の両方に適用されます。
  • 「[JIT]は360で常にフラッシュする必要があります」 -間違っています。コンパイルされたコードは、通常のコンパイルされたコードと同様にキャッシュに保存できます。(パイプラインフラッシュを意味する場合は、上記のポイントを参照してください。)
  • 「ジェネリック[...]コード生成を使用する」 -ジェネリックは他のすべてと同じようにJIT化され、他のすべてと同様にJITtedコードは高速です。ジェネリックを使用してもパフォーマンスが低下することはありません。
  • 「言語のすべてのセクシーな部分は分岐予測を必要とします...」 -これはどのようにC ++にも当てはまらないのでしょうか?- 「...または[...]インプレースコード生成」 -彼はJITtingを意味しますか?高速だと言いましたか?(デスクトップ CLRが実際のコード生成を使用するすべての場所には行きません-Xbox 360ではサポートされていない機能です!)
  • 「[C#にはない]大規模なライブラリ(C ++の)」 -XNA自体を除く そしてもっとたくさん。(それでも、これはいくぶん公平なポイントです。)

Xbox 360上のXNAは、.NET Compact Framework CLRの修正バージョンで実行されます。デスクトップ版の標準に達していないことは間違いありません。JITterはおそらくそれほど良いものではありませんが、それも悪いとは思いません。私は彼が言及しなかった驚いてガベージコレクタ恐ろしいデスクトップCLRと比べを。

(もちろん-あなたが専門的に開発されたゲームでガベージコレクタを打つべきではありません、とにかくあなたが配分で注意しなければならないのと同様に、任意のプロ級のゲーム。)

(.NET Compact Frameworkの実際の技術的な説明については、この記事シリーズの概要JITコンパイラGCおよびヒープから始めてください。)

彼が彼の用語について完全に不明確である方法は、彼が何を意味するかを理解することさえ難しくします。彼は最大暴言モードであるか、彼が何について話しているのか分からないかのどちらかです。


邪魔にならないようになったので、ネイティブにするのではなく、360でXNAを使用することで見逃してしまうことがいくつかあります

  • 非常に高速なCPU浮動小数点演算を行うためのSIMD / Vectorユニットへのアクセス
  • おそらくC#よりも少し高速になるネイティブ言語コードを使用する機能
  • される能力はほとんどあなたがメモリを割り当てる方法とビットlazier
  • XBLIGゲームは6コアのうち4コアのみにアクセスできます(ただし、3つのCPUをすべて使用できますが、フルコアでもないため、多くをお見逃しなく)-これがXBLIG XNA以外に適用されるかどうかは不明ゲーム
  • 本当にわかりにくいグラフィカルなトリックを行うための完全なDirectXアクセス

また、これらはCPU側の制限にすぎないことも指摘しておく価値があります。GPUで実行する完全に無料のアクセスがまだあります。

この回答では、これらと事実上同じ質問が何であるかについて説明しました。その答えで述べたように、XNAは「プロフェッショナル」開発に絶対に適しています。

避けるべき唯一の理由は、C ++の既存の知識ベースと同じように、C#タレントの雇用、C#エンジンのライセンス、既存のC#コードの再利用ができないためです。または、C#をサポートしていないプラットフォームをターゲットにしている可能性もあります。

もちろん、「プロフェッショナル」な開発者ではない私たちの多くにとって、XNAはXbox 360に乗る唯一の選択肢であり、要点を述べてます。


他の質問に答えるには:

C#で何も、C ++で使用するのと本質的にまったく同じ方法でデータ指向のアプローチを使用することを止めるものはありません。

C#には、コンパイル時にコードを自動的にインライン化する機能がありません。(チェックに行くことなく)コンパクトCLRのJITterはメソッドをインライン化できない(デスクトップCLRができる)と確信しています。そのため、パフォーマンスが重要なコードの場合は、C#を手動でインライン化する必要がありますが、C ++ではいくつかの支援が提供されます。

おそらく、衝突検出やC#での流体シミュレーションなど、CPU演算を集中的に使用しないことが多い大きな理由は、ベクトルユニットへのアクセスの不足です(上記を参照)。


私は自分自身を思い出せませんが、C#は単純な配列を繰り返し処理するのを止めませんか?int、float、charなどの最初のクラス型をボックス化したことを覚えています。そのため、一部のデータ指向のアプローチは可能な限り速く動作しません。そうですか?私は何を覚えていますか?
リチャードファビアン

2
C#は、値に型を割り当てると、値型(組み込み関数だけでなく、独自の値型を作成できます)をボックス化しますobject。また、バージョン1(ジェネリックの前)では、それらをボックス化せずに非配列コンテナに入れることはできませんでした。しかし最近では、ボックスなしのコードを書くのは非常に簡単です。また、CLRプロファイラーを使用すると、ボクシングをしている可能性のある場所を検出できます。
アンドリューラッセル

JITインタープリターを持つことさえ可能ですか?逆説的に聞こえます。
共産主義のダック

JIT解釈として分類するスレッド化されたコードテクニックをいくつか見てきました。それは間違いなくエッジケースです。

1
@Roy T.「XNA Math Library」(DirectXの一部)と「XNA Framework」は、非常に残念な名前の衝突を伴う2つのまったく異なるものです。リンクしたドキュメントは、XNA Frameworkには適用されません。XNA Frameworkの数学タイプは、SIMD / Vectorユニットを使用しません
アンドリューラッセル

5

「プロフェッショナル」を定義する必要があります。Angry Birds、Plants vs Zombiesなどはできますか?絶対に。Crysis 2、COD、Haloはできますか?疑わしい。C#の使用は、CPUに非常に負荷がかかり、メモリの最後の1バイトをすべて圧縮する必要がある(ガベージコレクションに負けてしまう)ゲームに実際に影響を与えるだけなので、まだできることがたくさんあります。

初心者向けの学習ツール、プロトタイピングツール、トレードオフに対処できるゲームを作成するためのプラットフォームなど、素晴らしく、多くのパワーとシンプルさを備えています。 「AAA」ゲームを呼び出します。また、クロスプラットフォームの移植と互換性で心配しなければならない多くの痛みと苦痛を取り除きます。

素晴らしいゲームを思いついて、XNAでできることの限界に出くわした場合、MSに直接連絡することをお勧めします。アイデアが本当に十分であれば、本格的な開発を手に入れることができますキット。


でもくだらないデューク・ヌケムの続編を作ってもらえますか?;)
ジョナサンコネル

1
ほとんどのベンチマークでは、C#コードの実行速度は、同等のCコード(PC上)よりも30%〜70%遅くなります。ほとんどのゲームはCPUに縛られておらず、C#コードの重要な部分は、同等のCコードとほぼ同じまたは高速で実行できる安全でないコードを使用して記述できることを考慮すると(JITにはより多くの情報が含まれるため、コンパイラよりも優れているため、最適化をより適切に選択できます、C#はAAAゲームに完全に対応していることがわかります。
BlueRaja-ダニーPflughoeft

@BlueRaja:安全でないコードは、Xbox 360でのほとんどのXNA開発のオプションではありません。

1
@BlueRaja:CLRが行うことができる最適化の数を減らすため、unsafeコードは多くの場合、安全な同等物より遅いことを指摘する価値があります。あなたはそれを測定しなければなりません。
アンドリューラッセル

2
@Blueraja「ほとんどのゲームがCPUバウンドではないことを考慮すると、」引用は大いに必要でしたか?すべての軸に縛られるわけではない、専門的に開発されたゲームには取り組んでいません。そうでなければ、機械のその部分に負荷を移す何らかの方法を見つけるでしょう!
リチャードファビアン

3

シンプルな事実は、面白いゲームを作成するために、多ポリゴン数、完全なHDRライティング、または世界で最も興味深い物理学を必要としないことです。ゲームプランにこれらのいずれも含まれていない場合は、開発時のソリューション?

よりプロフェッショナルなゲームには、物理​​モデルとアニメーションシステムがあります

それは間違っています。プロのゲームには、ゲームプレイを実装し、芸術的な外観を実現するために必要なものがあります。ゲームはよりリアルに見えるか、より詳細な物理学を持っているため、よりプロフェッショナルではありません。プロフェッショナルなゲームは、ゲームプレイと視覚的な目的を時間通りに、予算通りに達成し、出荷して利益を上げます。


1
ポリゴン数が多く、HDRがグラフィックスカードに該当しますか?したがって、C#とC ++でまったく同じパフォーマンスを期待する必要があります。
BlueRaja-ダニーPflughoeft

@BlueRaja:それらにもCPUコストがかかり、特に360に
メモリが

多かれ少なかれ、グラフィックスのlib呼び出しには、ネイティブコードよりも少しオーバーヘッドがあります。一方、最新のグラフィックスライブラリは、主要なボトルネックの1つであるため、フレームごとのドライバーの呼び出し回数を減らすために非常に努力しています。
drxzcl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.