Update()で新しいオブジェクトを作成するのは間違っていますか?


8

Unityを使用していますが、時々、などnewでth キーワードを使用しています...Updatenew Vector3()

これはメモリリークの原因ですか?つまり、すべてのフレームで新しいVector3が作成されます。これが動作方法である場合、メモリ内に作成された何千ものベクターがあることを意味します。それは本当ですか、それとも私は間違っていると思いますか?


2
これは、C#のインとアウトに慣れていない一般的なC ++ユーザーからの質問のように聞こえますが、それで十分でしょうか?
Pharap 2017年

私はここで同様の質問に答えました。はであるnew Vector3ためVector3、問題ありませんstruct。それがクラスであるなら、それは問題です。オブジェクトプーリングの使用に関する投稿全体をお読みください。
プログラマー

回答:


15

C#には、大まかに2種類のタイプがあります値タイプと参照タイプです。

new両方を作成するときに使用しますが、値型はスタック上に作成され(ほとんどの場合)、参照型のみがヒープ上に作成されます。作成された参照型は、ガベージコレクターがたまたま出現するまでとどまり、不要になったと判断して収集します。スタック上のインスタンスは、スタックフレームがなくなると(それらが作成された関数が終了すると)効率的に破棄されます。

Vector3Unityの値型であるため、これまでに作成したインスタンスのほとんどすべてがスタックに格納されるため、作成と破棄の両方が簡単に行えます。したがって、ここで何か問題が発生することはないでしょう。それは確かにメモリリークを引き起こしません、そしてそれはほとんど間違いなくパフォーマンスの問題ではありません(とにかくあなたは確かにプロファイリングしたいでしょう)。

フレームごとに多くの新しい参照タイプを作成すると、ガベージコレクターがより頻繁に実行され、すべてのスレッドがその作業を一時停止するときにヒッチが発生する可能性があるため、問題が発生する可能性があります。しかしVector3、のような値型はかなり安全な賭けです。


1
「値型はスタック上に作成される(ほとんどの場合)」がローカル変数にのみ当てはまることを強調する必要があると思います。私はそれが少し独創的であることを知っていますが、それが現在述べられている方法は初心者を誤解させる可能性があります。int参照型はヒープに格納されるため、参照型のフィールドはヒープ上に配置されます。それはさておき、+ 1
Doval

1
@Dovalの方がはるかに正確なステートメントは、「値型は、スタック上または参照型の割り当てられたスペース内など、以前に割り当てられたスペースに配置される」というものです。
ラチェットフリーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.