2011-08-27 16 views
15

私はC#2010とXNA 4.0を使ってゲームを書いています。私はそれが良いゲームであり、いくつかの「ちょっとしたこと」ではないので、私の目標の1つは良いフレームレートです。これについては、XNA関連またはC#関連のアドバイスをお願いしたいと思います。コードをスピードアップしてFPSを改善するにはどうすればよいですか?ここでXNAゲームのパフォーマンス

は、私が見つけたいくつかのものです:

  • (C#の)list<>array instedを使用すると、パフォーマンスに多くを改善します、場合にあなたは膨大なデータ量(あるいはたくさんアクセスしたい:アレイを有します20000項目の20000
  • のリストのほぼ180%FPS(C#の)for代わりのforeachを使用すると、それは、5〜10%の違いのようなものだと同じ20000個の要素のパフォーマンスを。改善されますを与えた。
  • (XNAとC#)メソッドを呼び出しますパフォーマンスが悪いので、自分のコードをmethに散布したときodsは他のメソッドなどと呼ばれていましたが、すべてがとてもクールでオブジェクト指向でしたが、1回の呼び出しごとに1〜3FPSのコストでした。
  • (xna)updateとdraw:コードをupdate()とdraw()に入れたときのパフォーマンスの違いはありませんでしたので、update()の下にいくつかのメソッドを置く必要はありませんよりよいFPSを期待して、すべてを一緒にdraw()に保つのではなく、
  • (xna)それは私かちょうど4.0かどうかわかりませんが、たくさんのテクスチャとかなり複雑なメッシュを含む.Xをロードすると、読み込むのに多くの時間がかかります。以前のものと同じテクスチャを持っているかどうかにかかわらず、XNAが各三角形のテクスチャをロードし始めたので、自分自身の.Xローダとメッシュ/モデルレンダラを作成しなければなりませんでした。あなたのためにテクスチャをキャッシュする自分のコンテンツローダを書くことさえ、解決策ではありません。何度も利用されているからです。ふわふわとしたものを作るなら、drawuserprimitivesを使って、Modelクラスを使わないことをお勧めします。 (4.0のみかどうかは分かりませんが、3.1でもこのようなパフォーマンスの問題がありました)
  • (xnaとc#)描画については、 "new"を使わないでください。私はウェブ上でいくつかのコードを見て、コピー/ペーストされたものは "basicEffect = new BasicEffect(graphicsDevice);"ドロー()のような醜さ、さらに悪いことに:ドロー()内の反復で。このようにすればパフォーマンスは低下します。代わりに、 "ゲーム"や静的なクラスでそのようなクラスを1つ持っています。これは他の「一時オブジェクト」にも当てはまりますが、醜いですが、グローバルなものを作成し、それを注意して使用してガーベッジコレクタのためにゲームを作るようなコードを作成する方が良いと思います。

ので、長い話を短くするには、[OK]を、ここでいくつかの良いアドバイスを投稿してくださいので、I /我々は、良い迅速かつ最適化されたゲームを作ることができます;)事前に

ありがとう: Zéiksz

+0

良いCW候補のようです:) – BlackBear

+1

これをコミュニティウィキにすることをお勧めします。 – Ben

+3

私は固体OOPアーキテクチャを使用してそれを購入することはありません毎回1〜3 fpsのコストを呼び出す... – Blindy

答えて

5

UberGeekGamesには、XNA最適化に関する記事があります。これは主にXboxとWP7をターゲットにしていますが、多くのことがPCにも当てはまります。

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

オリジナルサイト死んでいるが、インターネットアーカイブで提供されています:

Archived version of High end performance optimizations on the xbox 360 and windows phone7

親指のルールは、 "最適化の前にプロファイル" です。

+0

+1私はサイトが気に入って、共有してくれてありがとう。 –

+6

24 AUG 12の時点でサイトが死んでいるようです。 – Inisheer

7

をソフトウェアの最適化は技術です。最良の最適化の種類は、収集された統計に基づく証拠です。

問題が解決するまで最適化しないでください。ゲームのプレイアビリティはこのメトリックや他のものよりも重要だと思いませんか?私の提案は、まずゲームを作ってから、あなたが望むように、それがどこの演技ではないのかを考えさせることです。

次に、特定の質問を投稿してください。ここでは、特定の問題に関するいくつかの助けを得るでしょう。

当面は、http://forums.create.msdn.com/forums/p/8642/45646.aspxのようなゲーム開発の書籍から詳しい情報を得ることをお勧めします。あなたはメソッドを呼び出すためにコストがかかると思うので、1つの方法ですべてのコードを入れないでください

: -

XNA Extereme 101は価値が

+0

私は、プリプログラミングの最適化はノー・ノーであることに同意します。しかし、私は、この問題にぶつかっている人々のための質問/回答が役に立つと思う。 –

+0

@erik-私もそれに同意します。この情報を収集するのは良い場所です。 –

+0

+1私はこの答えに完全に同意します。パフォーマンスの問題に遭遇している人は、間違って何かを間違って実行しており、プロファイラを実行して特定の問題を見つけ出す必要があります。問題がある場合は、メソッド呼び出しの半分をマージすることは役に立ちません。 –

7

私の2セントの興味深いチュートリアルのようです。あなたが空の方法を呼んで1-3 FPSを失うと思っているなら、おそらく1-3の損失を研究し終えていないでしょう。空のメソッド呼び出しの間にその損失が真実であるためには、何千ものFrameRateを持っていなければなりません.1-3ドロップについては心配しません。

FPSは、XNAのパフォーマンスを判断するための悪い方法です。可変時間ステップを有効にすると、OSが関与する他のプロセスがフレームレートに影響を与える可能性があります。あなたは本当に代わりにプロファイルする必要があります。実際にUpdate & /またはDrawメソッドを完了するためにSystem.Diagnostic.Stopwatchオブジェクトを使用して時間を計測することに集中してください。一緒にではなく、非常に重要です。

ドローコールでは 'new'キーワードは避けるべきではありませんが、更新の両方の場合は&描画のどこにでも...参照型のみです。いつでもどこでも価値のあるタイプの新しいキーワードを使用してください。

関連する問題