5


1

XNAゲームのC#デリゲートパフォーマンス

現在、C#.net xnaゲームエンジンを開発しています。

私はアップデートマネージャ/スケジューラ/イベントシステムを持つ方法を見つけようとしています。 現在、デリゲートを使用して、スケジュールされた動的なタスクとイベントを作成する方法を提供しています。

私は最近、デリゲートが遅くなる可能性があることを読みました。 私のゲームのデリゲートは毎フレーム呼び出されており、そこからパフォーマンスに影響があるのではないかと思っていましたか?

更新:

私もこれを見つけましたhttp://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

これが私が心配していたことであり、それを回避する方法があると思います。 他のすべての情報をありがとう。

5 Answer


8


心配する必要はありません-デリゲートは通常の関数呼び出しよりも少し遅くなりますが、1秒間に数百万回呼び出していない限り、気付くことは非常に疑わしいです。

ボトルネックにならない限り、デリゲートに固執することをお勧めします。


1


パフォーマンスヒットがあるかどうかに関係なく、より良い質問はパフォーマンスヒットがあるかどうかです。 デリゲートの有無にかかわらず、アプリケーションのパフォーマンスを測定して、パフォーマンスヒットが許容できるかどうかを判断する必要があります。


1


明らかに、デリゲートvs. 直接的なメソッド呼び出しですが、最新の(バージョン1.1以降の)CLRのバージョンでは、インターフェイス経由のメソッド呼び出しとほぼ同じくらい高速です。

大まかなパフォーマンス測定値の表は次のとおりです。http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

いつものように、パフォーマンスが許容できるかどうかを測定する必要があります。 パフォーマンスクリティカルなコード(アニメーション)でデリゲートを使用しており、問題が発生していないため、問題なく動作することを期待しています。


1


推測(および推測)は正確ではなく、ゲームの実際のパフォーマンスと必ずしも一致しません。 実際のパフォーマンスヒットを知る唯一の方法は、少なくとも1種類のプロファイリングを使用することです。 http://blogs.msdn.com/b/shawnhar/archive/2009/07/06/why-measure-when-you-can-guess.aspx [なぜ推測できるのかを測定する理由]

パフォーマンスの実際の測定値を取得することに加えて、次のことを考慮してください。 ゲームが60fpsで実行されている場合(ペースの速いゲームでは30fpsでも楽しんでおり、ターンベースのゲームのように遅い場合は20fpsで処理できます)、可変時間で300fpsを打つことができます-stepモード、およびデリゲートは全体で20フレームのコストがかかります(おそらく、そうではないでしょう)。 ゲームは固定タイムステップモードで60fpsを維持できます。


1


ここでは、他の人の答えをエコーし​​ます。代理人は問題でない限り問題ではありません。プロファイラはあなたの友達です。

問題になる可能性があることに注意する必要があるのは、フレームごとにデリゲートを再作成する場合です。その場合、余分なゴミが生成され、パフォーマンスが低下する可能性があります。 ただし、CLRプロファイラーなどのツールを使用して、これが問題かどうかを最初に判断してください。