Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Workflow

Memahami Pengumpulan Sampah di AS3

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Keti Pritania (you can also view the original English article)

Apakah Anda pernah menggunakan aplikasi Flash dan melihat lag di dalamnya? Masih tidak tahu mengapa permainan keren flash yang berjalan perlahan-lahan pada komputer Anda? Jika Anda ingin tahu lebih banyak tentang kemungkinan penyebab, maka artikel ini adalah untuk Anda.

Kami menemukan penulis ini mengagumkan berkat FlashGameLicense.com, tempat untuk membeli dan menjual permainan!

Dipublish ulang Tutorial

Setiap beberapa minggu, kami mengunjungi kembali beberapa posting favorit pembaca kami dari sepanjang sejarah situs. Tutorial ini pertama kali diterbitkan pada Juni 2010.


Hasil akhir Tinjauan

Mari kita lihat pada hasil akhir yang kita akan bekerja menuju:


Langkah 1: Berjalan melalui cepat referensi

Sebelum kita masuk ke subjek nyata, pertama Anda perlu tahu sedikit tentang karya-karya bagaimana instantiating dan referensi dalam AS3. Jika Anda telah membaca tentang hal itu, saya masih sarankan membaca langkah kecil ini. Dengan cara itu, semua pengetahuan akan segar di kepala Anda dan Anda tidak akan memiliki kesulitan membaca sisa Tips ini cepat!

Penciptaan dan referensi contoh dalam AS3 ini berbeda dari kebanyakan orang berpikir. Instansiasi (atau "penciptaan") sesuatu terjadi hanya ketika kode meminta untuk membuat objek. Biasanya, hal ini terjadi melalui kata kunci "baru", tetapi juga hadir ketika Anda menggunakan sintaks yang literal atau menentukan parameter untuk fungsi, misalnya. Contoh ini ditunjukkan di bawah ini:

Setelah sebuah objek dibuat, ia akan tetap sendiri sampai ada referensi. Untuk melakukan itu, Anda biasanya membuat variabel dan meneruskan nilai objek ke variabel, sehingga ia tahu objek mana yang saat ini dipegangnya. Namun (dan ini adalah bagian yang kebanyakan orang tidak tahu), ketika Anda melewati sebuah variabel nilai ke variabel lain, Anda tidak membuat objek baru. Anda justru membuat link ke obyek yang kedua variabel sekarang terus! Lihat gambar di bawah ini untuk penjelasan:

Gambar mengasumsikan kedua variabel 1 dan 2 variabel dapat menahan smiley (yaitu mereka dapat terus jenis yang sama). Di sisi kiri, hanya variabel 1 ada. Namun, ketika kita membuat dan menetapkan variabel 2 ke nilai yang sama 1 variabel, kami tidak menciptakan hubungan antara variabel 1 dan 2 variabel (kanan atas bagian dari gambar), sebaliknya kami menciptakan link antara Smiley dan variabel 2 (bagian kanan bawah gambar).

Dengan pengetahuan ini, kita dapat beralih ke kolektor sampah.


Langkah 2: Setiap kota kebutuhan Garbage Collector

Sudah jelas bahwa setiap aplikasi membutuhkan jumlah tertentu memori untuk menjalankan, perlu ada variabel untuk memegang nilai-nilai dan menggunakannya. Apa yang tidak jelas adalah bagaimana aplikasi berhasil objek yang tidak diperlukan lagi. Apakah itu daur ulang mereka? Apakah itu menghapusnya? Hal ini meninggalkan objek dalam memori sampai aplikasi ditutup? Semua tiga pilihan dapat terjadi, tapi di sini kita akan membicarakan secara khusus yang kedua dan ketiga.

Bayangkan situasi di mana sebuah aplikasi menciptakan banyak objek ketika sudah diinisialisasi, tapi setelah periode ini berakhir lebih dari setengah dari benda-benda yang diciptakan tetap tidak terpakai. Apa yang akan terjadi jika dibiarkan dalam memori? Mereka pasti akan mengambil banyak ruang di dalamnya, sehingga menyebabkan orang apa panggilan lag, yang lambat-down terlihat dalam aplikasi. Sebagian besar pengguna tidak seperti ini, jadi kami harus menghindarinya. Bagaimana kita dapat kode untuk membuat aplikasi berjalan lebih efisien? Jawabannya adalah di pengumpul sampah.

Garbage Collector adalah bentuk manajemen memori. Hal ini bertujuan untuk menghilangkan benda yang tidak digunakan dan menempati ruang di memori sistem. Dengan cara ini aplikasi dapat berjalan dengan penggunaan memori pembelian. Mari kita lihat cara kerjanya:

Ketika aplikasi Anda mulai berjalan, ia meminta jumlah memori dari sistem yang akan digunakan oleh aplikasi. Aplikasi mulai kemudian mengisi ini memori dengan informasi yang Anda butuhkan; setiap objek yang Anda buat yang masuk ke dalamnya. Namun, jika penggunaan memori mendapat dekat memori diminta pada awalnya, berjalan Garbage Collector, mencari objek yang tidak digunakan untuk mengosongkan beberapa ruang di memori. Kadang-kadang hal ini menyebabkan sedikit lag dalam aplikasi, karena overhead besar objek pencarian.

Dalam gambar, Anda dapat melihat puncak memori (dilingkari hijau). Puncak dan drop tiba-tiba disebabkan oleh kolektor sampah, yang bertindak ketika aplikasi telah mencapai penggunaan memori diminta (jalur merah), menghapus semua tidak perlu objek.


Langkah 3: Mulai SWF File

Sekarang bahwa kita tahu apa yang bisa lakukan Garbage Collector untuk kita, sudah waktunya untuk mempelajari bagaimana kode untuk mendapatkan semua manfaat dari itu. Pertama-tama kita perlu tahu bagaimana bekerja Garbage Collector, dalam tampilan praktis. Dalam kode, objek menjadi layak untuk pengumpulan sampah ketika mereka menjadi terjangkau. Ketika sebuah objek tidak dapat diakses, kode memahami bahwa hal itu tidak akan digunakan lagi, jadi itu harus dikumpulkan.

ActionScript 3 memeriksa reachability melalui sampah koleksi akar. Pada saat ini objek tidak dapat diakses melalui sampah koleksi akar, menjadi layak untuk koleksi. Di bawah ini Anda melihat daftar akar pengumpulan sampah utama:

  • Variabel tingkat paket dan statis.
  • Variabel lokal dan variabel dalam lingkup metode pelaksana atau fungsi.
  • Contoh variabel instance kelas utama aplikasi atau tampilan daftar.

Untuk memahami bagaimana menangani objek Garbage Collector, kita harus kode dan memeriksa apa yang terjadi dalam contoh file. Saya akan menggunakan FlashDevelop's AS3 proyek dan Flex's kompilator, tapi aku mengasumsikan Anda dapat melakukannya pada setiap IDE yang Anda inginkan, karena kita tidak akan menggunakan hal-hal tertentu yang hanya ada di FlashDevelop. Aku telah membangun sebuah berkas sederhana dengan struktur tombol dan teks. Karena ini bukan tujuan dari tip cepat ini, saya akan dengan cepat menjelaskan hal itu: ketika sebuah tombol diklik, fungsi kebakaran. Setiap saat kita ingin menampilkan beberapa teks pada layar, Anda memanggil fungsi dengan teks dan ditampilkan. Ada juga bidang teks lain untuk menunjukkan gambaran untuk tombol.

Tujuan dari file contoh kami adalah untuk membuat objek, menghapusnya dan memeriksa apa yang terjadi kepada mereka setelah dihapus. Kita akan membutuhkan cara untuk mengetahui apakah objek hidup atau tidak, sehingga kita akan menambahkan pendengar ENTER_FRAME untuk masing-masing objek, dan membuat mereka menampilkan beberapa teks dengan waktu mereka telah hidup. Jadi mari kita kode obyek pertama!

Saya membuat gambar smiley lucu untuk objek, dalam penghormatan kepada Michael James Williams besar Avoider permainan tutorial, yang juga menggunakan gambar smiley. Setiap objek akan memiliki nomor di atas kepala, sehingga kita dapat mengidentifikasi itu. Juga, saya bernama obyek pertama TheObject1, dan objek kedua TheObject2, sehingga akan mudah untuk membedakan. Mari kita pergi ke kode:

Objek kedua tampak hampir sama. Berikut ini adalah:

Dalam kode, newObjectSimple1() dan newObjectSimple2() adalah fungsi yang dipecat ketika tombol sesuai mereka diklik. Fungsi ini hanya membuat objek dan menambahkannya di tampilan layar, jadi kita tahu bahwa itu diciptakan. Selain itu, ini menciptakan pendengar acara ENTER_FRAME dalam setiap objek, yang akan membuat mereka menampilkan pesan setiap detik, selama mereka aktif. Berikut adalah fungsi:

Fungsi ini hanya menampilkan pesan pada layar dengan waktu objek telah hidup. Berikut adalah file SWF dengan contoh saat ini:


Langkah 4: Menghapus objek

Sekarang bahwa kita telah membahas penciptaan benda, mari kita coba sesuatu: Apakah Anda pernah bertanya-tanya apa yang akan terjadi jika Anda benar-benar menghapus (Hapus semua referensi) objek? Apakah itu bisa sampah yang dikumpulkan? Itulah apa yang kita akan menguji sekarang. Kita akan membangun dua tombol Hapus, satu untuk setiap objek. Mari kita membuat kode untuk mereka:

Mari kita lihat di SWF sekarang. Apa yang Anda pikir akan terjadi?

Seperti yang Anda lihat. Jika Anda klik "Membuat Object1" dan kemudian "Hapus Object1", tidak ada yang benar-benar terjadi! Kita bisa mengatakan kode berjalan, karena teks yang muncul di layar, tapi mengapa tidak objek mendapatkan dihapus? Objek masih ada karena itu tidak benar-benar dihapus. Ketika kami membersihkan semua referensi untuk itu, kami memberitahu kode untuk membuatnya memenuhi syarat untuk pengumpulan sampah, tetapi pengumpul sampah tidak pernah berjalan. Ingat bahwa pengumpul sampah hanya akan berjalan ketika penggunaan memori saat ini semakin dekat dengan memori diminta ketika aplikasi mulai menjalankan. Itu masuk akal, tapi bagaimana kita akan menguji ini?

Aku pasti tidak akan menulis sepotong kode untuk mengisi aplikasi kita dengan benda-benda berguna sampai penggunaan memori mendapatkan terlalu besar. Sebaliknya, kita akan menggunakan fungsi saat ini tidak didukung oleh Adobe, menurut Grant Skinner artikel, yang memaksa Garbage Collector untuk menjalankan. Dengan cara itu, kami dapat memicu metode ini sederhana dan melihat apa yang terjadi ketika berjalan. Juga, sekarang saya akan sebut Garbage Collector sebagai GC, demi kesederhanaan. Berikut adalah fungsi:

Fungsi sederhana ini, yang hanya menciptakan dua objek LocalConnection(), dikenal untuk memaksa GC untuk lari, jadi kita akan menyebutnya ketika kita ingin hal ini terjadi. Saya tidak menyarankan untuk menggunakan fungsi ini dalam aplikasi yang serius. Jika Anda melakukannya untuk tes, ada tidak ada masalah nyata, tapi kalau itu untuk sebuah aplikasi yang akan mendapatkan didistribusikan kepada orang-orang, ini bukan fungsi yang baik untuk menggunakan, karena itu dapat dikenakan efek negatif.

Apa yang saya sarankan untuk kasus-kasus seperti ini adalah bahwa Anda hanya membiarkan GC berjalan dengan kecepatan sendiri. Jangan mencoba untuk memaksa itu. Sebaliknya, fokus pada pengkodean efisien sehingga masalah memori tidak terjadi (kami akan mencakup hal ini dalam langkah 6). Sekarang, mari kita lihat contoh SWF lagi, dan klik tombol "Mengumpulkan sampah" setelah membuat dan menghapus objek.

Apakah Anda menguji file? Itu berhasil! Anda dapat melihat bahwa sekarang, setelah menghapus objek dan memicu GC, menghilangkan objek! Perhatikan bahwa jika Anda tidak menghapus objek dan memanggil GC, tidak akan terjadi, karena masih ada referensi ke objek dalam kode. Sekarang, bagaimana jika kita mencoba untuk menjaga dua referensi ke objek dan menghapus salah satu dari mereka?


Step 5: Membuat referensi lain

Sekarang bahwa kita telah membuktikan bahwa GC bekerja persis seperti yang kita inginkan, mari kita coba sesuatu yang lain: link referensi lain untuk objek (Object1) dan menghapus aslinya. Pertama, kita harus membuat sebuah fungsi untuk link dan membatalkan tautan rujukan ke objek. Mari kita lakukan:

Jika kita menguji swf kami sekarang, kita akan melihat bahwa jika kita menciptakan Object1, kemudian menyimpannya, menghapusnya dan memaksa GC untuk lari, tidak akan terjadi. Itu karena sekarang, bahkan jika kami menghapus link "asli" ke objek, ada referensi lain untuk itu, yang menjaga dari memenuhi syarat untuk pengumpulan sampah. Ini pada dasarnya adalah semua yang Anda perlu tahu tentang pengumpul sampah. Itu bukan misteri, setelah semua. Tapi bagaimana untuk kita terapkan hal ini lingkungan kita saat ini? Bagaimana kita bisa menggunakan pengetahuan ini untuk mencegah aplikasi kita berjalan perlahan-lahan? Ini adalah apa langkah 6 akan menunjukkan kepada kita: cara untuk menerapkan ini dalam contoh nyata.


Langkah 6: Membuat kode Anda efisien

Sekarang untuk bagian terbaik: membuat kode Anda bekerja dengan GC efisien! Langkah ini akan memberikan informasi yang berguna bahwa Anda harus selalu sepanjang hidup Anda - menyimpannya dengan baik! Pertama, saya ingin memperkenalkan cara baru untuk membangun objek Anda dalam aplikasi Anda. Ini adalah sederhana, namun efektif untuk berkolaborasi dengan GC. Dengan cara ini memperkenalkan dua kelas yang sederhana, yang dapat diperluas kepada orang lain, setelah Anda memahami apa yang dilakukannya.

Gagasan tentang cara ini adalah untuk melaksanakan fungsi - disebut destroy() - pada setiap objek yang Anda buat, dan menyebutnya setiap kali Anda selesai bekerja dengan objek. Berisi semua kode yang diperlukan untuk menghilangkan semua referensi ke dan dari objek (tidak termasuk referensi yang digunakan untuk memanggil fungsi), sehingga Anda memastikan objek meninggalkan aplikasi Anda benar-benar terisolasi, dan mudah dikenali oleh GC. Alasan untuk ini dijelaskan di langkah berikutnya. Mari kita lihat kode umum untuk fungsi:

Dalam fungsi ini, Anda akan memiliki untuk menghapus semuanya dari objek, sehingga tetap terisolasi dalam aplikasi. Setelah melakukan hal itu, akan lebih mudah untuk GC Pelokalan dan menghapus objek. Sekarang mari kita lihat beberapa situasi di mana memori kebanyakan kesalahan terjadi:

  • Benda-benda yang digunakan hanya dalam selang waktu eksekusi: berhati-hati dengan orang-orang ini, karena mereka dapat menjadi orang-orang yang mengkonsumsi banyak memori. Benda-benda yang ada hanya untuk beberapa waktu tertentu (misalnya, untuk menyimpan nilai-nilai ketika menjalankan fungsi) dan mereka tidak diakses sangat sering. Ingatlah untuk menghapus semua referensi kepada mereka setelah Anda selesai menggunakannya, jika tidak, Anda dapat memiliki banyak dari mereka dalam aplikasi Anda, hanya mengambil ruang memori. Ingatlah bahwa jika Anda membuat banyak referensi kepada mereka, Anda harus menghilangkan masing-masing melalui fungsi destroy().
  • Benda-benda yang tertinggal di tampilan daftar: selalu menghapus objek dari tampilan daftar jika Anda ingin menghapusnya. Tampilan daftar salah satu akar pengumpulan sampah (ingat?) dan jadi sangat penting bahwa Anda menjaga benda Anda jauh dari itu ketika menghapus mereka.
  • Panggung, orangtua dan akar referensi: jika Anda ingin menggunakan properti banyak ini, ingatlah untuk menghapus mereka ketika Anda sudah selesai. Jika banyak benda Anda memiliki referensi untuk ini, Anda mungkin kesulitan!
  • Pendengar acara: kadang-kadang referensi yang membuat benda Anda mendapatkan dikumpulkan adalah pendengar acara. Ingatlah untuk menghapus mereka atau menggunakannya sebagai lemah pendengar, jika diperlukan.
  • Array dan vektor: kadang-kadang array dan vektor dapat memiliki benda lain, meninggalkan referensi di dalamnya yang Anda mungkin tidak menyadari. Berhati-hatilah dengan array dan vektor!

Langkah 7: Pulau referensi

Walaupun bekerja dengan GC besar, tidak sempurna. Anda harus memperhatikan apa yang Anda lakukan, jika tidak hal-hal buruk dapat terjadi dengan aplikasi Anda. Saya ingin menunjukkan masalah yang mungkin muncul jika Anda tidak mengikuti semua langkah yang diperlukan untuk membuat kode Anda bekerja dengan GC dengan benar.

Terkadang, jika Anda tidak menghapus semua referensi ke dan dari suatu objek, Anda mungkin memiliki masalah ini, terutama jika Anda menautkan banyak objek bersama-sama dalam aplikasi Anda. Kadang-kadang, satu referensi tersisa bisa cukup untuk ini terjadi: semua objek Anda membentuk pulau referensi, di mana semua objek terhubung ke yang lain, tidak memungkinkan GC untuk menghapusnya.

Bila berjalan GC, melakukan tugas-tugas sederhana yang dua untuk memeriksa objek untuk menghapus. Salah satu tugas ini menghitung berapa banyak referensi setiap benda mempunyai. Semua benda-benda dengan 0 referensi mendapatkan dikumpulkan pada saat yang sama. Tugas lainnya adalah untuk memeriksa apakah ada sekelompok objek yang link ke satu sama lain, tetapi tidak dapat diakses, sehingga membuang-buang memori setiap kecil. Periksa gambar:

Seperti yang Anda lihat, benda hijau tidak dapat dicapai, tetapi mereka menghitung referensi adalah 1. GC melakukan tugas kedua untuk memeriksa ini sepotong objek dan menghapus mereka semua. Namun, ketika bongkahan terlalu besar, GC "menyerah" pada memeriksa dan mengasumsikan objek dapat dicapai. Sekarang bayangkan jika Anda memiliki sesuatu seperti itu:

Ini adalah pulau referensi. Ini akan mengambil banyak memori dari sistem, dan tidak akan dikumpulkan oleh GC karena kompleksitas dari itu. Kedengarannya cukup buruk, ya? Itu dapat dengan mudah dihindari, meskipun. Pastikan Anda telah dibersihkan setiap rujukan ke dan dari sebuah objek, dan kemudian hal-hal yang menakutkan seperti yang tidak akan terjadi!


Kesimpulan

Ini untuk sekarang. Dalam Tip Cepat ini kami belajar bahwa kami dapat membuat kode lebih baik dan lebih efisien untuk mengurangi masalah jeda dan memori, sehingga membuatnya lebih stabil. Untuk melakukan ini, kita harus memahami bagaimana referensi objek bekerja dalam AS3, dan bagaimana untuk mendapatkan keuntungan dari mereka untuk membuat pekerjaan GC benar di aplikasi kita. Terlepas dari kenyataan bahwa kita dapat membuat aplikasi kita lebih baik, kita harus berhati-hati ketika melakukannya - selain itu bisa menjadi lebih berantakan dan lebih lambat!

Saya harap Anda menyukai tip sederhana ini. Jika Anda memiliki pertanyaan, menjatuhkan komentar di bawah ini!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.