Melanggar Aturan Pengumpulan Sampah Persatuan

Sekali waktu, ada programmer game persatuan bernama Lancelot. Saya sangat bersemangat. Dia belum tahu, tapi akhirnya dia akan menghadapi sisi paling gelap dari pengumpulan sampah Unity.

gambar

Lancelot selalu mencari judul yang lebih besar dan lebih besar untuk dikerjakan. Maka ia bekerja keras untuk mendapatkan peluang besar di industri game.

Itu tidak mudah, yang dia tahu.

Bintik-bintik ini di industri game dulu dan masih dicadangkan untuk sebagian kecil programmer game. Dan dia tidak yakin akan memenuhi standar itu.

Tetapi dia bertahan dan terus mempertajam keterampilan pemrogramannya.

Lancelot mulai mengerjakan game-game kecil. Mungkin pada titik tertentu, dia akan mendapatkan peluang besar yang dia cari, pikirnya.

Tahun-tahun berlalu sampai dia mendapatkan kesempatan yang dia tunggu-tunggu. Dia diminta untuk port game VR besar ke platform mobile. Semeriah Lancelot, dia tidak bisa berhenti bertanya-tanya apakah dia cukup baik untuk tugas itu. Itu menakutkan tetapi dia menerima tantangan itu. Dia tahu bahwa dia hanya bisa tumbuh dari itu.

Kekhawatiran terbesar Lancelot adalah kebutuhan untuk secara besar-besaran meningkatkan kinerja permainan. Sebenarnya itu adalah tantangan ganda. Dia harus meningkatkan kinerja sebesar 20% untuk platform yang secara signifikan kurang kuat .

Setelah berbulan-bulan bekerja tanpa henti, ia akhirnya berhasil mengoptimalkan permainan cukup untuk memiliki baseline kinerja yang solid.

Namun, masalah tak terduga hanya sekitar sudut ...

Profiler kesatuan mengungkapkan penurunan frame-rate yang signifikan setiap beberapa detik. Dan itu membuatnya khawatir karena itu tidak akan memungkinkannya untuk mengirim permainan. Rilis game dalam bahaya. Itu membuatnya benar-benar tidak nyaman.

Berdasarkan pengalamannya sebelumnya, Lancelot dengan cepat mencurigai adanya pemulung . Bagaimanapun, ia tahu bahwa mengalokasikan memori sementara dalam game terlalu sering dapat menyebabkan lonjakan kinerja ini. Sama seperti tempat sampah di dapur semua orang, Anda tahu sudah waktunya untuk membersihkannya ketika mencapai 80% dari kapasitasnya.

Maka ia menghabiskan waktu berhari-hari melawan alokasi memori yang menyusahkan. Dia melakukan semua jenis optimasi yang bisa dia pikirkan. Kumpulan objek, cache data, optimisasi struktur data ...

Menghabiskan hari-hari ini dengan mengoptimalkan membuatnya sedikit unggul dalam perjalanan kinerja. Lancelot bangga dengan pekerjaannya, tetapi kekhawatirannya hanya bertambah ketika dia melihat pengumpul sampah masih berjalan setiap 15 detik.

Memainkan game dalam VR dengan penurunan kinerja ini akan membuat orang terlihat pucat.

β€œBagaimana itu bisa terjadi?” Dia bertanya-tanya.

Dengan lebih sabar dan menggali, Lancelot menemukan sumber alokasi memori kedua yang tidak dia lihat sebelumnya. Itu terjadi di perpustakaan pihak ke - 3 .

Dia melihat dan segera menyadari bahwa dia berada di posisi terburuk yang pernah ada: perpustakaan itu adalah sumber tertutup. Tidak hanya itu, dia juga mencoba menggunakan pengumpul sampah tambahan Unity tetapi dia tidak mampu membayar harga kinerjanya.

Lancelot kehabisan pilihan.

Dia merasa putus asa tetapi berhasil tetap tenang. Dia berada dalam situasi yang lebih buruk.

Dia bisa merekayasa balik perpustakaan dan melakukan optimasi alokasi memori sendiri. Masalahnya adalah lisensi melarang hal-hal seperti itu. Dan dia terlalu muda untuk masuk penjara.

Opsi kedua yang dia pertimbangkan adalah mengalokasikan banyak memori di heap. Dia tahu bahwa persatuan memicu proses pengumpulan sampah ketika penggunaan tumpukan mencapai persentase tertentu. Jadi menambah tumpukan harus memberinya lebih banyak waktu di antara pengumpulan sampah.

Sayangnya, itu masih belum cukup.

Perlahan-lahan terasa seolah-olah dia tidak memiliki kendali atas situasi. Itu sulit, tapi sekali lagi, dia bertahan .

Jadi Lancelot datang dengan ide gila . Bagaimana jika dia sepenuhnya menonaktifkan pengumpulan sampah? Apakah itu mungkin? Dia merasakan di tulangnya betapa berisiko ide semacam itu. Dia tidak ingin menambahkan kemungkinan game crash pada poin yang tidak terduga. Terakhir kali dia memeriksa, itu tidak menyenangkan bagi para pemain. Mungkin waktu memang berubah, tetapi lebih baik aman daripada menyesal.

Selain itu, ia khawatir akan menunda rilis game. Dia tidak ingin para pemainnya melewatkan gelar ini untuk Natal. Dia ingat betapa menyenangkan dia bermain EverQuest selama liburan ini. Dia tidak akan mengambil itu dari para pemain.

Mencapai titik ini, dia tidak punya pilihan selain untuk menonaktifkan pengumpul sampah.

Dia masuk ke mode penelitian dan menemukan bahwa dia memang bisa secara manual menonaktifkan pengumpulan sampah . Dia menjalankan puluhan percobaan untuk melihat berapa lama permainan akan bertahan tanpa kehabisan memori. Dia melakukan segala macam tes untuk menekankan sistem. Mengklik di mana-mana, berjalan dan melompat-lompat, beralih di antara berbagai aplikasi.

Angka-angka mulai berdatangan dalam spreadsheet-nya: 25 menit, 28 menit, 30 menit ... Dia juga mencatat bagaimana penggunaan tumpukan meningkat dari waktu ke waktu untuk memastikan dia tidak pernah melebihi anggaran yang aman.

Dengan angka-angka itu, Lancelot membentuk margin aman yang murah hati dan menyiapkan prototipe . Dia akan menjalankan pengumpulan sampah secara manual selama memuat layar dan setiap beberapa menit.

Dia punya harapan lagi.

Dia dengan sopan meminta QA untuk melalui permainan puluhan kali.

Memori selalu sesuai anggaran. Tidak ada crash. Tidak ada efek samping.

Perjalanan panjang ini membawanya ke titik di mana ia bisa mengirimkan permainan.

Dan coba tebak? Ratusan pemain sekarang menikmatinya selama periode Natal.

Awalnya, ia merasa tidak nyaman dengan solusi ini. Itu adalah langkah yang berisiko dan dia tahu itu. Tapi dia berhasil melakukannya.

Lancelot belajar untuk merasa nyaman dengan yang tidak nyaman . Dia belajar menjadi lebih pragmatis . Karena ada saatnya ketika seorang programmer harus.

Apakah ada di antara cerita itu yang berbunyi? Jika demikian, intuisi Anda mungkin benar.

Pemrogram itu adalah saya.

Untuk saat-saat Anda membutuhkannya, inilah cara Anda dapat mengelola pemulung:

Cuplikan kode itu menunjukkan kepada Anda cara menonaktifkan pengumpulan sampah otomatis. Ini menjalankan proses GC secara manual setiap menit dan mungkin selama transisi layar (pudar menjadi hitam).

Waspadai kemungkinan efek sampingnya:

  • Gangguan : jika Anda tidak bermain cukup aman Anda akan kehabisan memori. Lebih buruk lagi, OS mungkin membunuh game Anda ketika Anda beralih di antara aplikasi
  • Waktu pengumpulan sampah yang lebih lama : menambah tumpukan akan membuat pengumpulan sampah di masa depan lebih lambat

Jika Anda perlu menghasilkan sampah dalam jumlah besar, berikut ini adalah metode sederhana yang hanya akan berfungsi:

public class GenerousGarbageCreator : MonoBehaviour { [SerializeField] private int garbageCreationRate = 1024; private static int[] _garbage; void Update() { _garbage = new int[garbageCreationRate]; } } 

Inilah yang akan Anda dapatkan di profiler:

gambar
Pengumpulan Sampah Unity: Pemicu Manual Berbasis Waktu

Di sana Anda melihat peningkatan penggunaan memori. Penggunaan tumpukan yang meningkat disorot sebagai "mono". Beruntung bagi kami, kami menjalankan pengumpul sampah manual setiap 3 detik.

Anda dapat dengan jelas melihat siklus pembersihan generasi sampah ini dalam grafik profiler. Bagi para pengembang game yang mempelajari fisika, Anda mungkin mengenalinya sebagai bentuk gelombang gigi gergaji.

Jika Anda menginginkan kode sumber proyek ini, Anda tahu di mana menemukannya (spoiler: sini).

Untuk optimasi memori yang lebih umum, Anda mungkin tertarik pada Unity Addressables. Dengan addressables Anda dapat mengurangi penggunaan memori total sehingga Anda dapat memicu pengumpulan sampah lebih jarang. Pada gilirannya, ini akan mengurangi lonjakan kinerja yang akan dialami pemain Anda.

Saya berharap dapat bekerja sama dengan Anda semua pada tahun 2020.
Ruben

Source: https://habr.com/ru/post/id484710/


All Articles