2012-03-29 3 views
6

私はC#を使用してゲームをプログラミングしています。したがって、私は非常にパフォーマンスが心配です。クラスVS ref構造

主な相違点は何か、そして可能であれば、クラスを使用してデータを渡すか、または参照渡しの構造体を使用するかのパフォーマンスに関する考慮事項を知りたいと思います。

パフォーマンス上の理由から、データをコピーしないことをお勧めします(refを渡すことはここでの値よりもはるかに高速です)。

私は、クラスは常に参照によって渡され、構造体は値渡しされていることを知っていますが、ここで参照することによって構造体を渡すことについて説明しています。

私が渡したいデータの例:前の例で

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

は、クラスを使用する場合との違いを作りますか?もしそうなら、違いは何ですか?この例では、クラスが構造体より高速でしょうか?どうして?

ありがとうございます。 Joao Carlos

+1

両方の方法でパフォーマンスプロファイリングを試しましたか?構造体がメソッド外にスコープされていると、ヒープ上に(ヒープ上のクラスに含まれるように)ヒープ上に配置されます。私はクラスまたはref構造体がメソッド呼び出しの点で同じパフォーマンスであると思われます。 –

+0

私は多くの経験プロファイリングがありません。Unity3Dのプロファイラを使ってプロファイリングチェックをしましたが、違いは見られませんでしたが、このタイプの "小さな魚" 、または他のすべてのゲーム関連のプロファイリングの間にまったく違いがないかどうかを調べることができます。 –

+0

OO言語でゲームをプログラミングしている間は、私は構造体に時間を費やすことはありません。 **私が**パフォーマンスの問題を得る前に直面する問題は**ゲームを終了していない**です。クラスとオブジェクトは、devの速度IMOを向上させます。 – Bitterblue

答えて

4

代理人が参照型 - Listを受け取るので、リスト全体を参照渡しにしています。

大きな構造体を値渡しすることは、参照のみを渡すよりも、最もコストがかかることは間違いありません。大きな構造体を持つときは、構造体として使用するのは通常は意味がありません。クラスに変換するだけです。

とにかく、あなたはですか?ここでパフォーマンスの問題がありますか?非常に時期尚早の最適化のようです。

+0

私はゲームをプログラミングしており、より速いコードを書いています。その正確なステップはそれほど問題ではありません。なぜなら、たいていの場合、1秒間に1000回以上の経路探索要求がないからです(私が仮定します)。しかし、パスファインダーのノード構造では、これは100ノード* 1,000pathFindingRequestsまで拡大する可能性があります。 –

+0

100ノードを1000回間接的に間接的に参照します。つまり、100,000回の参照を解除すると、1秒間に何らかの問題が発生することはありません。 – zmbq

+0

彼のゲームが遅れていることが判明した場合、プロファイリングは恐らく責任あるコードの一行を明らかにするでしょう。最近のコンピュータは非常に高速です。 – fabspro

7

私はクラスが常に参照し、構造体は値渡し ですが、私はここに参照 によって構造体を渡すことについて話していることを渡されていることを知っています。

おそらく正しいアイデアはありますが、これは間違いです。 refキーワードを使用しない限り、C#のすべての値が渡されます。

クラスインスタンスは参照型です。構造体インスタンスは値型です。

参照型を値渡しするときは、参照のコピー(小さい)を渡します。値型を値で渡すと、データ全体のコピーが渡されます(潜在的に大きい)。

Jon Skeetはこのすべての良い説明を持っていますhere