Cara elegan untuk mensimulasikan sejumlah besar entitas dalam dunia game


33

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?

Jawaban:


10

Inilah cara kami memecahkan masalah ini di Stendhal . Dalam kasus kami ada banyak hal yang terjadi secara berkala, tetapi tidak setiap belokan: Mantra penyembuhan, tanaman tumbuh sedikit lebih jauh, mayat merosot, barang-barang di tanah kedaluwarsa.

Kami memiliki nomor belokan yang meningkat di setiap belokan. Dan kami mempertahankan peta nomor belokan di masa depan yang menunjuk ke satu set objek yang perlu diberitahukan pada belokan itu.


bagaimana jika sesuatu yang lain berinteraksi dengan objek sementara itu? Misalnya hewan yang tidur mungkin terbangun oleh batu pukul. Haruskah Anda menghapus jadwal binatang dalam kasus itu?
Emiliano

Itu tergantung pada situasinya: Jika tindakan yang dilakukan tidak berbahaya (seperti bangun saat sudah bangun) kita biarkan saja. Tetapi jika tindakan menggunakan beberapa sumber daya, kami mencari melalui antrian yang tertunda dan menghapusnya.
Hendrik Brummermann

14

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.


10

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:

  • Bisakah pemain membedakan hewan dengan perut kosong dan hewan penuh?
  • Apakah informasi ini penting bagi mereka dengan cara apa pun, ketika mereka membuat pilihan interaksi dalam permainan Anda?
  • Bisakah pemain yang menonton binatang itu secara konsisten memprediksi hasil dari peristiwa yang disimulasikan, atau apakah angka acak sudah cukup?

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.


Ya, pemain akan dapat mengetahui perbedaannya dan ada beberapa efek pada gameplay ini, tetapi ini lebih merupakan 'tipu muslihat' untuk bersenang-senang saat ini. Agak seperti sistem luka di Benteng Kerdil, yang juga sangat rinci tetapi dapat diabaikan. Tapi seperti yang sudah Anda sebutkan itu sangat menyenangkan untuk dikerjakan dan itulah fokus utama saya saat ini.
Marc Müller

9

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.


2

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.


1

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.


3
Pola terbang, maksud Anda?
topright

0

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.


Saya pikir itu akan memperumit hal-hal karena harus ada banyak hal terjadi di dalam hewan. Sebagai contoh, hanya karena perut mencerna sesuatu tidak berarti jantung berhenti berdetak atau hewan berhenti berjalan. Tentu, Anda bisa mendefinisikan satu set negara, yang masing-masing mengambil fungsi tertentu menjadi pertimbangan, tetapi jumlah negara akan sangat besar.
Marc Müller

Banyak hal dapat terjadi per negara, karena Anda menyimpan semua organ yang aktif pada suatu negara dan mengeksekusi masing-masing frame masing-masing. Banyak dari apa yang terjadi dalam simulasi Anda tampaknya sesuai dengan transisi negara. Misalnya Mengunyah -> Mencerna. Tapi saya kira Anda benar bahwa hewan tidak hanya memiliki satu keadaan. Ada transisi yang terjadi, katakanlah dengan anggota badan yang tidak terkait dengan transisi yang terjadi dalam sistem pencernaan. Tapi mungkin itu lebih rumit dari apa yang Anda miliki. Hanya berpikir itu mungkin sesuatu yang perlu dipertimbangkan.
Erik Engheim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.