Apakah salah membuat objek baru di Pembaruan ()?

8

Saya menggunakan Unity dan terkadang saya menggunakan newkata kunci th Update, seperti new Vector3()dll ...

Saya bertanya-tanya apakah ini menyebabkan kebocoran memori? Maksud saya di setiap frame Vector3 baru dibuat. Jika ini cara kerja itu berarti ada ribuan Vektor yang dibuat dalam memori. Apakah itu benar atau saya salah berpikir?

pengguna98816
sumber
2
Ini terdengar seperti pertanyaan dari pengguna C ++ biasa yang tidak terbiasa dengan seluk beluk C #, apakah itu asumsi yang memadai?
Pharap
Saya menjawab pertanyaan serupa di sini . Tidak apa-apa untuk dilakukan new Vector3karena Vector3a struct. Jika itu adalah kelas maka itu masalah. Baca seluruh postingan tentang menggunakan Object pooling.
Programmer

Jawaban:

15

Di C # ada dua jenis tipe, kira-kira: tipe nilai dan tipe referensi .

Anda menggunakan newsaat Anda membuat keduanya, tetapi tipe nilai dibuat di stack (sebagian besar waktu), dan hanya tipe referensi yang dibuat di heap. Setelah dibuat, tipe referensi bertahan sampai pengumpul sampah datang, menentukan mereka tidak lagi diperlukan, dan mengumpulkan mereka. Contoh pada tumpukan hancur secara efisien ketika bingkai tumpukan hilang (ketika fungsi mereka dibuat pada akhirnya).

Vector3adalah tipe nilai dalam Unity, jadi hampir semua instance yang pernah Anda buat akan disimpan di stack dan dengan demikian murah untuk dibuat dan dihancurkan. Jadi Anda tidak mungkin melakukan kesalahan apa pun di sini. Ini tentu saja tidak membuat kebocoran memori, dan hampir pasti tidak akan menjadi masalah kinerja (Anda ingin profil untuk memastikan, bagaimanapun).

Membuat banyak jenis referensi baru setiap frame dapat bermasalah karena hal itu dapat mendorong pengumpul sampah untuk menjalankan lebih sering, menyebabkan pasak saat menjeda semua utas Anda untuk melakukan tugasnya. Tapi tipe nilai suka Vector3adalah taruhan yang cukup aman.


sumber
1
Saya pikir Anda harus menekankan bahwa "tipe nilai dibuat pada stack (sebagian besar waktu)" hanya berlaku untuk variabel lokal . Saya tahu ini agak terlalu berlebihan, tetapi cara ini sekarang bisa menyesatkan pemula. Sebuah intlapangan di tipe referensi berakhir di tumpukan sejak referensi jenis disimpan di heap. Selain itu, +1
Doval
1
@Doval pernyataan yang jauh lebih akurat adalah bahwa "tipe nilai dimasukkan ke dalam ruang yang sebelumnya dialokasikan seperti pada stack atau di dalam ruang yang dialokasikan dari tipe referensi".
ratchet freak