Anggaplah Anda memiliki permainan di mana ada banyak (banyak banyak) entitas yang melayani beberapa fungsi, tidak semua yang terus-menerus diperlukan atau perlu dipertimbangkan dalam setiap frame. Masalah konkret yang saya kerjakan di mana masalah ini hadir adalah simulasi rinci dari tubuh termasuk organ-organnya.
Dalam permainan, setiap makhluk memiliki tubuh sendiri yang dipisahkan menjadi bagian-bagian yang lebih kecil (batang tubuh, kaki, dll.) Dan kadang-kadang bagian-bagian ini mengandung organ, yang melayani fungsi tertentu di dalam tubuh. Apakah suatu organ saat ini melayani suatu tujuan atau aktif tidak pernah benar-benar jelas. Bagaimanapun, seekor hewan mungkin memiliki perut kosong yang karenanya tidak perlu mencerna apa pun. Akan sangat konyol untuk memeriksa atau mensimulasikan setiap objek di setiap frame dan sangat mahal segera setelah Anda memiliki banyak makhluk di dunia. Jadi saya sedang memikirkan cara untuk secara pintar membedakan antara objek yang perlu diperbarui dan yang tidak.
Apa yang saya hasilkan sepertinya solusi paling tidak ok. Ini menciptakan antrian / tumpukan sederhana (penting adalah bahwa setiap elemen akan dihapus segera setelah dibaca; urutannya tidak relevan) yang disebut "tumpukan perhatian" di mana objek yang perlu disimulasikan berada. Objek yang perlu perhatian hanya akan menempatkan diri ke tumpukan atau diletakkan di sana oleh objek lain. Objek-objek ini mungkin akan mengimplementasikan antarmuka sederhana dengan fungsi mensimulasikan () -.
Diterapkan ke contoh pencernaan saya sebelumnya ini berarti:
Pemain memilih sesuatu untuk dimakan (asumsikan roti) dari inventaris dan memasukkannya ke mulut karakternya dan mulut dimasukkan ke tumpukan perhatian. Dalam bingkai berikutnya mulut diambil dari tumpukan dan fungsi simulasikan () -nya disebut. Karena ini mulut, akan masuk akal untuk mensimulasikan mengunyah di sini. Ini bisa berlangsung selama beberapa bingkai di mana mulut terus menempatkan dirinya ke tumpukan sampai memutuskan makanan siap untuk ditelan. Dalam hal ini mulut memasukkan roti yang dikunyah ke dalam perut (saya tahu itu tidak langsung ke sana, tetapi kerongkongan ditinggalkan untuk penyederhanaan), yang kemudian juga dimasukkan ke tumpukan perhatian. Pada frame berikutnya, simulasi proses pencernaan dimulai. Demikian seterusnya untuk sisa organ yang diperlukan.
Masalah yang dapat diprediksi dengan ini adalah objek yang tidak digunakan. Hewan tidur adalah contoh yang baik untuk hal ini. Ini bisa dilakukan seperti yang dijelaskan sebelumnya dengan meletakkan hewan yang tidur di tumpukan dan memeriksa setiap kali jika perlu bangun, tetapi itu sepertinya sia-sia karena hanya itu yang dilakukan. Untuk membuat objek pemalasan lebih efisien saya berencana untuk menambahkan semacam jadwal yang menyimpan pekerjaan yang harus dilakukan pada waktu tertentu. Jika seekor hewan tidur, itu akan menempatkan pekerjaan pada jadwal yang akan dijadwalkan untuk jangka waktu tertentu setelah hewan itu tidur. Pekerjaan ini kemudian akan menempatkan hewan tidur ke tumpukan perhatian lagi. Sekarang, Anda bisa mengatakan bahwa hewan tidur yang tidak berada di tumpukan perhatian dapat kehilangan diserang oleh sesuatu karena AI-nya tidak disimulasikan,
Sekarang, sejujurnya saya tidak tahu apakah ini bahkan dekat dengan solusi elegan untuk masalah ini karena kurangnya pengalaman. Apakah saya dekat dengan sesuatu yang dapat digunakan? Bagaimana ini biasanya dilakukan atau apakah ada yang punya saran atau solusi yang lebih baik?
sumber
Kedengarannya seperti masalah yang mirip dengan input: Anda memiliki 100+ tombol pada keyboard tetapi tidak ingin memeriksa setiap tombol pada setiap frame, jadi apa yang Anda lakukan?
Dua jawaban: polling atau pesan sistem.
Polling = kapan saja hal itu benar-benar penting dalam game, kueri status tombol keyboard (atau objek, dalam kasus Anda). Sisa waktu, abaikan saja.
Pesan = minta setiap tombol keyboard (objek) memasukkan sesuatu ke dalam antrian pesan saat ditekan atau dilepaskan (saat perlu perhatian). Pada setiap iterasi dari loop game, ia melihat melalui antrian dan menyelesaikan semua pesan sebelum melanjutkan.
sumber
Jadi saya akan mengambil langkah mundur dari implementasi dan meninjau pertanyaan dari perspektif desain. Apakah Anda memiliki rencana yang solid untuk menampilkan semua detail yang ingin Anda sertakan dalam simulasi ini?
Sebagai contoh:
Pada dasarnya aturan umum adalah untuk tidak membuat simulasi Anda lebih rumit daripada outputnya. Pada akhirnya, jika satu-satunya animasi yang Anda miliki untuk domba adalah merumput, tidur, lari. Maka tidak masalah berapa banyak faktor yang masuk dalam keputusan tentang negara mana yang akan dipilih. Semua pemain akan melihat adalah domba yang tidur di malam hari, lari dari bahaya dan makan di siang hari.
Simulasi perilaku adalah satu ton kesenangan untuk dikerjakan, tetapi selalu ingat pengalaman pengguna akhir.
sumber
Saya memiliki masalah yang sama pada permainan yang saya kerjakan beberapa tahun yang lalu - simulasi objek sangat rumit dan tidak dapat dilakukan secara detail pada setiap objek di dunia.
Solusinya adalah menggunakan konsep LOD untuk simulasi. Objek dalam tampilan pemain akan menjalankan simulasi penuh. Objek yang jauh dari pemain menjalankan simulasi yang sangat sederhana secara berkala. Saat objek masuk ke tampilan pemain, mereka akan bertransisi dari kursus, pembaruan simulasi berkala ke pembaruan terinci dan teratur.
sumber
Solusi dengan jadwal bagus. Perhatikan bahwa setiap entitas harus memiliki daftar petunjuk untuk tindakan di masa mendatang, yang memberikan kemungkinan untuk membatalkan tindakan di masa depan jika perlu. Yaitu. hewan yang tertidur bangun langsung ketika diserang, jadi Anda harus membatalkan tindakan membangunkannya di masa depan.
sumber
Ada pola desain untuk ini. Saya pikir itu disebut Objek Database?
Pada dasarnya, Anda menyimpan satu "templat" domba yang dapat mewakili semua domba non-khusus di dunia gim, menggambar semuanya dengan cara yang sama, menyimpan data unik di dalam objek templat, katakan sebagai tabel lokasi dan / atau waktu domba -since-geser. Lalu kapan pun Anda perlu membuat domba menjadi unik, Anda dapat membuat contoh khusus untuk melacak domba unik itu.
Hal yang sama berlaku untuk animasi. Jika ini adalah animasi diam atau acara yang umum untuk setiap instance, yang dapat berada di instance template, di mana animasi yang lebih spesifik dapat dijadwalkan secara terpisah.
Beberapa waktu yang lalu, saya menulis sebuah game untuk kontes pemrograman yang loop utamanya disebut animate () di seluruh adegan. Itu menggunakan pointer fungsi untuk mengganti animasi menganggur dengan yang lain sesuai kebutuhan, dan menggunakan teknik untuk mendukung animasi yang diwariskan (misalnya memutar karakter yang berdiri pada disc berputar).
Itu mirip dengan menggunakan delegasi untuk animasi.
sumber
Apakah mesin negara bekerja? Hewan tersebut dalam keadaan tidur misalnya, keadaan makan, keadaan berlari dll. Untuk setiap keadaan Anda mengasosiasikan daftar organ aktif. Jadi setiap frame yang Anda kunjungi setiap hewan, aktifkan keadaan, cari daftar organ untuk keadaan itu dan jalankan pembaruan pada masing-masing organ.
sumber