Ok jadi saya punya daftar besar semua entitas saya yang saya lewati dan perbarui. Di AS3 saya bisa menyimpan ini sebagai Array (panjang dinamis, tidak diketik), Vektor (diketik) atau daftar tertaut (bukan asli). Saat ini saya menggunakan Array tetapi saya berencana untuk mengubah ke Vector atau daftar yang ditautkan jika lebih cepat.
Lagi pula, pertanyaan saya, ketika Entitas dihancurkan, bagaimana saya harus menghapusnya dari daftar? Saya dapat membatalkan posisinya, memisahkannya atau hanya memasang bendera di atasnya untuk mengatakan "lewati aku, aku sudah mati." Saya mengumpulkan entitas saya, jadi Entitas yang sudah mati kemungkinan besar akan hidup kembali di beberapa titik. Untuk setiap jenis koleksi, apa strategi terbaik saya, dan kombinasi jenis pengumpulan dan metode penghapusan mana yang paling berhasil?
Jawaban:
Saya akan menyimpan semua add / remove dalam daftar terpisah dan melakukan operasi tersebut setelah saya mengulangi pembaruan-loop.
sumber
Kerangka Flixel menggunakan bendera mati (sebenarnya beberapa bendera yang menentukan apakah itu harus ditarik, diperbarui, dan sebagainya). Saya akan mengatakan bahwa jika Anda akan menghidupkan kembali entitas, dan jika kinerja adalah masalah, Anda menggunakan bendera mati. Dalam pengalaman saya, instantiasi entitas baru adalah operasi paling mahal dalam use case yang Anda gambarkan, dan menyambungkan atau membatalkan elemen dapat menyebabkan memori mengembung mengingat pengumpulan sampah Flash yang kadang-kadang sarat dengan sampah.
sumber
dead
sangat membantu dengan kinerja.Sementara beberapa teknik secara inheren lebih efisien daripada yang lain, itu hanya masalah jika Anda kehabisan siklus pada platform target Anda. Gunakan teknik apa pun yang memungkinkan Anda menyelesaikan permainan dengan lebih cepat. Cobalah untuk tidak bergantung pada implementasi spesifik dari struktur data kontainer Anda sementara itu dan itu akan membantu Anda untuk mengoptimalkan setelahnya jika Anda membutuhkannya.
Hanya untuk membahas beberapa teknik yang sudah dibahas oleh orang lain di sini. Jika urutan entitas penting, maka bendera mati dapat memungkinkan Anda untuk melakukan splice selama loop pembaruan Anda pada frame berikutnya. misalnya. pseudocode sangat sederhana:
Ini adalah karakteristik dari skema ini:
sumber
Berbicara dalam hal pengalaman pemrograman umum saya, splicing biasanya merupakan operasi lambat, yang melibatkan pengalihan semua elemen yang ada ke atas. Saya pikir menetapkannya ke nol akan menjadi solusi terbaik di sini ; bendera mati akan berfungsi tetapi Anda harus berhati-hati untuk tidak membiarkannya membuat kode Anda berantakan.
Kami sebenarnya hanya berbicara tentang pengumpulan sumber daya di ruang obrolan, sebenarnya. Ini latihan yang sangat bagus, dan senang mendengar Anda melakukan itu. :)
sumber
Secara pribadi, saya akan menggunakan daftar tertaut. Iterasi daftar yang disukai cepat, serta menambah dan menghapus item. Menggunakan Array atau Vector akan menjadi pilihan yang baik jika Anda membutuhkan akses langsung ke item dalam struktur (mis. Akses ke indeks), tetapi itu tidak terdengar seperti Anda membutuhkannya.
Setiap kali Anda menghapus item dari daftar tertaut, Anda dapat menambahkannya ke kumpulan objek yang kemudian dapat didaur ulang untuk menghemat alokasi memori.
Saya telah menggunakan struktur data poligonal di beberapa proyek dan sangat senang dengan mereka.
Sunting: Maaf, saya pikir jawabannya tidak terlalu jelas dalam hal strategi penghapusan: Saya sarankan untuk menghapus item dari daftar, segera setelah itu mati dan menambahkannya langsung ke struktur penyatuan (daur ulang). Karena menghapus item dari daftar tertaut sangat performan, saya tidak melihat masalah dalam melakukannya.
sumber
next
pointer mereka ke node setelah yang dihapus. Jika Anda tidak ingin repot melakukan ini sendiri, daftar double-linked akan menjadi Struktur Data pilihan."Cukup tetapkan bendera di atasnya untuk mengatakan" lewati aku, aku sudah mati. "Aku mengumpulkan entitasku, jadi Entitas yang sudah mati kemungkinan besar akan hidup kembali di beberapa titik"
Saya pikir Anda menjawab pertanyaan Anda sendiri sehubungan dengan aplikasi spesifik ini. Saya akan menjauh dari array jika Anda berencana untuk mengerjakannya selain dari push dan pop. Daftar tertaut akan menjadi cara yang lebih cerdas untuk dilakukan jika Anda berencana melakukan operasi berat. Dengan semua yang dikatakan, jika Anda berencana untuk mengintegrasikan kembali entitas yang sama ke dalam game maka masuk akal untuk hanya menetapkan variabel boolean dan memeriksanya selama loop operasi game.
sumber
Salah satu solusi umum dan bersih yang saya temukan pada lib yang saya gunakan adalah menggunakan peta yang dapat dikunci.
Anda memiliki 2 operasi
lock()
danunlock()
, sementara Anda mengulangi peta Anda akanlock()
, sekarang dari titik ini setiap operasi yang mengubah peta tidak berpengaruh, itu hanya akan didorong ke dalamCommandQueue
yang akan berjalan setelah Anda meneleponunlock()
.Jadi menghapus entitas akan memiliki pseudo-code berikut:
dan ketika kamu
unlock()
Satu-satunya hal yang harus Anda pertimbangkan adalah bahwa Anda hanya akan menghapus entitas setelah loop.
EDIT: ini adalah solusi yang diusulkan oleh Simon.
sumber
Inilah jawaban yang saya dapatkan dari Liosan :
/gamedev//a/46765/24633
sumber
Saya punya dua metode.
Saat Anda memanggil objek yang akan dihapus, itu benar-benar menetapkan dua flag:
1.Satu untuk memberitahu wadah bahwa suatu objek telah dihapus
2.Satu untuk memberitahu kontainer objek mana yang telah diminta untuk dihapus
Satu Menggunakan vektor objek
Kemudian dalam fungsi pembaruan, periksa untuk melihat apakah suatu objek telah dihapus dan jika demikian iterate melalui semua objek dan hapus yang memiliki tanda hapus
Dua Menggunakan vektor (pointer ke a) objek.
Dalam fungsi pembaruan, jika suatu objek akan dihapus, beralih melalui objek dan tambahkan objek yang tidak akan dihapus ke vektor baru. hapus vektor objek dan atur pointer ke vektor baru
sumber