現在、私のゲームのトレイルエフェクトとして、5フレームごとに、スプライトの半透明テクスチャコピーがトレールリスト<に追加されています。C#XNA 2Dトレイルエフェクトの最適化
これらの軌跡のアルファ値は、フレームごとにデクリメントされ、描画関数がリストを反復して各テクスチャを描画します。 0アルファをヒットしたら、リスト<>から削除されます。
結果は、移動するエンティティの後ろに小さなトレイル効果があります。問題は約100以上のエンティティで発生し、フレームレートが大幅に低下し始めます。
すべてのトレイルテクスチャは同じスプライトシートから来るので、バッチ処理の問題だとは思わない。私はコードをプロファイリングし、CPU強度はFPSドロップスパイクの間に低くなりますが、通常のFPSであるため、GPUの制限を意味すると仮定します。
この効果をより効率的に達成する方法はありますか?使用
相続人は、一般的なコードのイム:私は注意しなければならないと思います
// fade alpha
m_alpha -= (int)(gameTime.ElapsedGameTime.TotalMilliseconds/10.0f);
// draw
if (m_alpha > 0) {
// p is used to alter RGB of the trails color (m_tint) depending on alpha value
float p = (float)m_alpha/255.0f;
Color blend = new Color((int)(m_tint.R*p), (int)(m_tint.G*p), (int)(m_tint.B*p), m_alpha);
// draw texture to sprite batch
Globals.spriteBatch.Draw(m_texture, getOrigin(), m_rectangle, blend, getAngle(), new Vector2(m_rectangle.Width/2, m_rectangle.Height/2), m_scale, SpriteEffects.None, 0.0f);
} else {
// flag to remove from List<>
m_isDone = true;
}
、トレイルクラスに与えられたm_textureは、すべてのコースで共有グローバルテクスチャへの参照です。各トレイルのハードコピーを作成しています。
EDIT:SpriteBatch.Draw呼び出しをコメントアウトするだけで、何百ものオブジェクトに対して1つのフレームごとに新しいトレイルを割り当てても、フレームにはドロップがありません。もっと良い方法が必要ですこの。
トレイルエフェクトを無効/ – MichaelHouse
トレールエフェクトを削除すると、フレームレートドロップが完全に修正されます。私は、GPUが処理するスプライトをあまりにも多く追加しているだけであることを確信しています。 – kbirk
いくつかのコードを投稿する必要があります。明らかにこのようなことが可能であり、パーティクルシステムは100粒子以上が容易に消えてしまいます。 – MichaelHouse