game android - cara menyimpan elemen game jadi gc tidak akan menyala

8

Saya sedang mengembangkan game android dan saya punya pertanyaan tentang menyimpan elemen-elemen game tanpa menembakkan pengumpul sampah.

Gim saya membutuhkan koleksi tempat elemen gim disimpan menurut posisi x, y (semua elemen gim memiliki x, y, lebar dan tinggi). Koleksinya kemudian dipanggil setiap frame untuk mengambil elemen sesuai dengan cameraX, cameraY, lebar dan tinggi kamera (pengguna dapat menggulir di sekitar game).

Contoh:

 function draw() {
   tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
     for(int i = 0; i < tmp.size(); i++) {
        tmp.get(i).draw();
     } 
  }

Saat ini saya menggunakan kelas Vector untuk mewakili elemen koleksi, tetapi gc terus menyala setiap beberapa menit. Saya melakukan semua alokasi saya di muka. Saya juga memodifikasi fungsi getElements untuk menerima 1 parameter lagi - vektor temp (dialokasikan di muka) yang diisi dengan elemen dan kemudian dikembalikan.

Bagaimana saya harus menyimpan elemen-elemen game agar gc tidak bisa dinyalakan (saya lebih suka jika tidak mungkin)?

Saya juga menambahkan elemen ke koleksi selama runtime, apakah saya harus mengalokasikannya dimuka juga?

Jernej
sumber

Jawaban:

3

Ya, jika Anda mengalokasikan apa pun pada saat runtime, pada akhirnya akan memicu GC. Secara umum, Anda menyiasatinya dengan menerapkan kumpulan objek ... dengan cara itu, Anda dapat melakukan pra-alokasi (atau setidaknya mengumpulkan contoh baru untuk digunakan kembali) semua objek seperti peluru dan entitas lain untuk menghindari pemicu GC.

sunting: Anda juga mungkin ingin menggunakan memory profiler (seperti eclipse memory analyzer ) yang dapat membantu Anda mengetahui rutinitas apa yang menghasilkan objek saat runtime.

Joel Martinez
sumber
jadi insted menggunakan kelas Vector menggunakan MyObject []? Tetapi kemudian saya harus melakukan pra-alokasi ukuran kumpulan objek sehingga saya dapat secara dinamis menambah dan menghapus objek ... sesuatu seperti MyObject [] pool = new MyObject [MAX_OBJECTS] baru; apakah ini yang kamu maksud?
Jernej
lebih khusus, jika Anda ingin 100% menghindari alokasi objek baru, maka Anda perlu mengalokasikan setiap instance yang terdapat dalam array itu. Saya menulis sebuah kelas dalam C # untuk kerangka kerja XNA yang memberikan keseimbangan yang bagus ... itu hanya menciptakan instance baru ketika pool tidak memiliki instance yang ada untuk diberikan. Hasilnya adalah bahwa beberapa detik pertama mungkin mengalokasikan beberapa objek, tetapi setelah kami mencapai jumlah maksimum # kejadian, tidak ada alokasi baru yang terjadi. Seharusnya relatif mudah untuk dikonversi ke java: codecube.net/2010/01/xna-resource-pool
Joel Martinez
2

Saya juga menyarankan membaca kode sumber untuk Pulau Replica , yang dikembangkan oleh seorang insinyur Android. Dia memiliki kelas kumpulan objek generik yang dapat diperluas untuk kumpulan objek kustom. Ia juga memiliki kelas larik khusus (dengan kemampuan tambah / hapus / pencarian) untuk menghindari keharusan menggunakan iterator saat melintasi berbagai objek.

Juga ingin menyebutkan bahwa DDMS pada Android SDK di Eclipse dapat melacak alokasi memori (lihat tab Pelacak Alokasi pada gambar).

f20k
sumber