Bagaimana City-sim mensimulasikan ratusan karakter?

8

Gim-gim saya biasanya mulai tertinggal dengan mudah ketika ada beberapa ratus kotak yang mewakili karakter yang mungkin. Sementara game seperti SimCity atau bahkan Anno memiliki ratusan karakter.

Saya menyadari bahwa game-game itu tidak memperbarui semuanya pada setiap tic, kebutuhan ditangani secara berkala dan itu bukan masalah render, tetapi semua makhluk kecil itu memiliki pencarian jalur individu dll.
Saya benar-benar tidak dapat memahami bagaimana mereka dapat menarik itu untuk ribuan karakter bahkan pada mesin lama. bagaimana mereka melakukan ini?

Pertanyaan ini diperbarui untuk merujuk pada Angka besar di mana individu tidak benar-benar masuk hitungan dan hanya disimulasikan untuk perendaman dan estetika.

(Terkait jika merujuk pada karakter individu: Bagaimana Dwarf Fortress melacak begitu banyak entitas tanpa kehilangan kinerja? )

(Pertanyaan berbeda tapi mungkin terkait ?: Rendering ratusan karakter animasi di Unity3D )

Misterios
sumber
2
Ini sebenarnya tidak terlihat seperti duplikat bagi saya. Sementara game seperti Dwarf Fortress benar-benar mensimulasikan tindakan setiap agen secara individual, begitu kita mencapai game skala kota seperti yang dijelaskan dalam pertanyaan ini, itu tidak lagi sangat praktis. Sebaliknya, sim ini biasanya beroperasi pada tingkat yang lebih "chunked" dari tren populasi, mengisi rincian setiap orang mengikuti tren tersebut hanya ketika Anda melihat dari dekat. Karena perbedaan strategi ini, saya pikir ini layak untuk dibuka kembali dan dijawab secara terpisah dari pertanyaan terkait.
DMGregory
Saya membuat beberapa perubahan untuk menyoroti perbedaan. Bagaimana cara memutuskan tautan pertanyaan?
MisteriosM
Optimalisasi kinerja adalah bidang yang sangat luas. Ada sejuta hal yang bisa Anda lakukan salah dalam kinerja dalam game Anda. Tetapi tanpa melihat output gim dan profiler Anda, sulit menentukan di mana kemacetan Anda. Kami sekarang dapat memotret dalam kegelapan dan merenungkan tentang memori lokalitas, paralelisasi, atau algoritme pencarian jalur lanjutan untuk banyak agen, tetapi sulit untuk mengatakan apa yang sudah Anda ketahui dan apa yang berlaku untuk game Anda. Jadi saya takut pertanyaan ini terlalu luas.
Philipp
Sudahkah Anda mencoba pengumpulan objek? Instansiasi itu mahal, mengaktifkan dan menonaktifkan objek yang sudah instantiasi tidak (sebanyak)
Anda juga bisa menggunakan emitor partikel. Karena mereka benar-benar hanya representasi visual dari data demografis, mereka tidak harus pintar atau kompleks.
Stephan

Jawaban:

12

Seperti kebanyakan gamedev, jawaban untuk bagaimana game sim kota mencapai prestasi yang tampaknya mustahil ini adalah: mereka mungkin tidak. Mereka hanya berpura-pura baik. ;)

Sims seperti ini biasanya akan beroperasi pada tingkat "chunked", memodelkan kelompok orang, lingkungan, koridor lalu lintas, atau dinamika kota lainnya secara keseluruhan, daripada memproses AI untuk setiap satu dari ribuan atau jutaan penduduk.

Ada beberapa cara untuk mendekati ini:

  • Bottom-up "jarang": di sini kita masih mensimulasikan warga kota individu, tetapi tidak "terlalu banyak" dari mereka, dan tidak setiap frame. Anda bisa memikirkan ini seperti jajak pendapat atau sensus yang dikeluarkan untuk sampel acak orang setiap minggu. Anda menginterpolasi hasil untuk menghasilkan perkiraan populasi virtual yang lebih luas - di mana mereka tinggal, panggilan mereka, pendapatan, demografi, dll.

    Jadi misalnya, jika Anda hanya mensimulasikan seratus penduduk di kota Anda, dan 5 dari mereka adalah siswa, maka Anda dapat memperkirakan bahwa sekitar 5% dari populasi kota Anda adalah siswa, dan menjadi contoh permintaan sekolah.

    Anda mungkin perlu membuat kembali sampel acak Anda dari distribusi populasi kota Anda sesekali, untuk menghindari kelebihan pengelompokan / sparseness (mis. Jika suatu lingkungan menjadi tidak populer dan semua penduduk sensus Anda pindah, Anda ingin mencatat eksodus tanpa meninggalkannya sepenuhnya tanpa representasi di sim Anda!)

  • Top-down: Di sini Anda datang dengan formula utama yang melihat kota Anda dan memodelkan dinamikanya secara keseluruhan. Dalam gaya yang mirip dengan ekonomi makro, kami mengabaikan rincian agen individu, atau menganggap mereka sebagai semacam "cairan" aktivitas ekonomi yang terus-menerus dapat dibagi yang mengalir sesuai dengan hukum berbasis prinsip.

    Daripada memikirkan preferensi individu dan variabilitas orang, aturan permainan Anda mungkin lebih mirip persamaan diferensial yang berkaitan dengan perkiraan kemudahan dan tarif pajak serta produktivitas dan nilai properti serta tingkat kejahatan dan dan dan ...

  • Middle-out: Berbagai hibrida antara keduanya dimungkinkan - misalnya, mensimulasikan setiap "faksi," "industri," atau segmen demografis kota sebagai meta-person-nya sendiri, membuat keputusan sendiri, tetapi menyebar dalam peta panas atau fungsi gelombang di kota daripada ada di satu tubuh. Atau memecah kota menjadi lingkungan yang masing-masing memproses aturan skala kecil mereka sendiri dalam interaksi dengan tetangga mereka.

Sekarang, ketika pemain memperbesar cukup dekat untuk melihat orang individu, atau melihat laporan statistik mengutip jumlah individu - itu tidak selalu merupakan kebenaran dasar yang digunakan untuk menjalankan sim. Sebaliknya, mereka dapat menjadi produk yang disimpulkan.

Katakanlah kita memperbesar blok kota tertentu. Dari keseluruhan sim kota kami, kami mengetahui populasi kasar bagian kota ini, jenis kegiatan yang terjadi di sana, saat-saat ketika aktif. Jadi atas permintaan, kita dapat menelurkan sejumlah orang yang tepat dari demografi yang tepat melakukan jenis-jenis kegiatan di sana. AI mereka bisa sangat sederhana, mungkin hanya sesederhana memainkan animasi di tempat atau mengikuti titik arah ke tepi pintu / layar terdekat tempat mereka dapat bertelur.

Ini berarti kita biasanya tidak perlu melakukan pathfinding untuk setiap agen. Sebagai gantinya, kita dapat melakukan satu pass master-pemetaan aliran di seluruh jaringan jalan, untuk mengidentifikasi volume keseluruhan dari berbagai jenis lalu lintas di sepanjang setiap segmen. Kemudian kita dapat menelurkan cukup kendaraan jenis yang tepat di segmen tersebut untuk mencerminkan kepadatan itu. Setelah bertelur, agen bisa bertahan dengan setir lokal atau titik arah yang dibuat sebelumnya untuk sampai ke titik de-spawn. Menjaga agar spawn di sepanjang setiap segmen seimbang dengan tingkat de-spawning memungkinkan kita mempertahankan volume lalu lintas yang kita inginkan.

Dengan cara ini, orang & kendaraan yang dilihat pemain adalah isapan jempol, seperti sistem partikel sup-up yang memberi kesan awan realistis tanpa benar-benar menghitung dinamika fluida penuh pada setiap molekul uap. ;) Kami mengaturnya sebagai set dressing untuk mengomunikasikan keadaan simulasi, daripada mengendarainya.

Untuk banyak game, ini sudah cukup. Pemain sering tidak dapat memilih agen individu untuk menginterogasi mereka tentang apa yang mereka lakukan di sana atau ke mana mereka pergi, jadi sulit untuk menemukan jahitannya dan perhatikan jika agen melakukan sesuatu yang tidak masuk akal, seperti mengemudi di blok yang sama tiga kali.

Tetapi jika Anda membutuhkan agen yang benar-benar konsisten dalam lingkungan yang padat penduduk, Anda dapat melihat teknik yang rapi yang disebut " Generasi Alibi ." Ini adalah teknik pengambilan sampel yang canggih yang memungkinkan Anda menghasilkan agen yang Anda harapkan akan ditemukan dalam situasi tertentu. Kemudian, jika pemain mencoba untuk menyelidiki satu lebih detail, Anda dapat secara surut mengambil sampel lebih detail tentang apa yang mereka lakukan, dengan cara yang konsisten dengan apa yang telah diamati pemain tentang mereka sejauh ini. Idenya adalah bahwa Anda masih mendapatkan manfaat ringan dari orang-orang "kardus berdiri" sebagian besar waktu, tetapi di tempat mereka dapat membuat alibi yang masuk akal untuk lulus sebagai agen yang sepenuhnya disimulasikan.

DMGregory
sumber