2012-02-21 2 views
2

XBOX用のアプリ(XNA Game)を開発しています。かなり簡単なアプリです。開始ページには、移動するgif画像を含むタイルが含まれています。それらのgif画像は実際にはすべてのタイルで一度読み込まれ、配列に配置されるすべてのpng画像です。次に、定義された遅延を使用して、これらの画像が再生される(遅延が通過するたびに増加するカウンタを使用して)。GCがキックしたときのXNA Xboxフレームドロップ

しかし、これはうまくいきますが、私はGIF画像の動きでわずか10秒ごとに少しの遅れがあることに気付きました。 Xboxのitsselfからアプリを実行しているとき、あなたが見ることができるように、FPSは、このような簡単なプログラムのためにかなり低い

http://gyazo.com/f5fe0da3ff81bd45c0c52d963feb91d8

(これはデバッグであり、私が手に:私は、いくつかのベンチマークのものを追加し始めました62fpsの平均)。 2つの重要な設定: Graphics.SynchronizeWithVerticalRetrace = false; IsFixedTimeStep = false;

isFixedTimeStepをtrueに変更すると、遅延が増加します。設定タイルには回転するホイールがあり、x秒ごとにホイールが少し戻ることがわかります。 SynchronizeWVRのカウントも同じですが、遅れも増加します。

私はとして、MAX HMU(ヒープメモリ使用量を)気にしないでください

...遅れがあり、それはで蹴るたびに遅れや瞬間ガベージコレクタキックとの間の接続に気づきましたこれは開始の量を取る、avgはより現実的です。ここで

は、しかし、私は、このツールから、私はそれを使用している最初の時間をあまり理解していない、パフォーマンスモニタから別の画面である...それがお役に立てば幸い:少し後

http://gyazo.com/f70a3d400657ac61e6e9f2caaaf17587

+0

Xbox向けに開発したとき、ガベージコレクションの非効率性は非常によく知られた問題です。 Googleで検索すると、多くの情報とソリューションが提供されます。最も一般的なキャッシングオブジェクトであり、複雑なバージョンではなく、オブジェクトを再利用するためのプールを作成します。 – Elideb

+0

@Mortana私は、360に関するGCのベストプラクティスの理解を深めるための回答とコメントですが、この質問を読んでいます。http://stackoverflow.com/questions/9142918/poor-performance-on-360-and- wp7/9150698#9150698 –

答えて

0

を研究私は原因を見つけた。

私はすべてGameComponentから派生し、ゲームのメインクラスのコンポーネントリストに追加されるカスタムコンポーネントを持っています。

これは、(2つの合計で)大きな問題であり、更新を必要としないものをすべて更新する原因となりました。 (描画方法はページの状態を念頭に置き、必要に応じて描画した唯一の方法でした)。 これは、GameComponentから派生した唯一のコンポーネントである、異なる "スクリーン"(または私がそれらを呼んだページ)を使用してこれを修正しました。

次に、アクティブなページのみを更新し、そのページのカスタムコンポーネントも更新されます。問題は修正されました。

第2の大きな問題は、次のとおりです。 私は、スクリーン上のものを相対的に、つまりパーセンテージとそのようなもので配置するのに役立つクラスを作った。 & v-alignsなど そのクラスは、サイズが&ベクトルのプロパティを持っていましたが、計算された値をバッキングフィールドに保存する代わりに、プロパティにアクセスするたびに再計算しました。しかし、そのような複雑なものを計算することは、CLRのために非常に難しくなった参照(親の&の子コンテナへの)を使用していました。

私は今、その代わりに20FPSの滴の、ときnecessairyを再計算するために異なるフラグで、完全に機能する最適化されたクラスに全体のポジショニングクラスを再構築し、私は今、170の+ FPSの平均値を取得します!

関連する問題