Di tempat virtual, sepenuhnya digerakkan oleh jaringan, dengan jumlah pemain yang sewenang-wenang dan jumlah musuh yang sewenang-wenang, data apa yang harus di-cache di memori server, untuk mengoptimalkan simulasi AI yang lancar?
Mencoba menjelaskan, katakanlah pemain A melihat pemain B ke E, dan musuh A ke G. Masing-masing pemain, melihat pemain A, tetapi tidak harus saling. Hal yang sama berlaku untuk musuh. Tolong pikirkan pertanyaan ini dari perspektif topdown.
Dalam banyak kasus, misalnya, ketika seorang pemain menembakkan senjatanya, server menangani suara sebagai "sinyal" radial yang setiap entitas lain dalam jangkauan "dengar" dan bereaksi.
Melakukan pencarian ini sepanjang waktu untuk seluruh area, yang berisi kemungkinan banyak pemain dan musuh yang tidak terkait, tampaknya menjadi masalah, ketika anggaran untuk setiap agen AI sangat kecil.
Haruskah setiap entitas cache apa pun yang masuk dan keluar dari radius kesadarannya? Apakah ada cara yang bagus untuk melacak entitas di dekat tanpa membanjiri memori dengan cache seperti itu?
Bagaimana dengan masalah terkait AI lain yang mungkin timbul, setelah mengasumsikan yang sebelumnya berfungsi dengan baik? Kita berbicara tentang lingkungan dengan kemungkinan ratusan musuh, segerombolan.
sumber
Jawaban:
Ada beberapa cara untuk melakukan ini, tetapi mereka bergantung pada di mana pun Anda akan memiliki sejumlah besar interaksi atau populasi yang sangat padat.
Sayangnya, jika Anda ingin simulasi tetap presisi, Anda harus menangani sebagian besar peristiwa yang dihasilkan oleh semua aktor dan menemukan semua / sebagian besar aktor yang membutuhkan pemberitahuan.
Tabrakan area murah
Mengenai masalah dengan bidang kesadaran Anda dapat menyelesaikannya menggunakan deteksi tabrakan sederhana.
Di dunia 2d melakukan deteksi tabrakan pada lingkaran adalah "murah". Misalnya operasi untuk mendeteksi jika suatu titik dalam lingkaran hanya membutuhkan 2 pengurangan, 2 perkalian dan tambahan. Anda tidak perlu melakukan root kuadrat karena Anda dapat menyimpan dan membandingkan jari-jari persegi area Anda dengan jarak kuadrat secara langsung.
Jika Anda menggunakan lingkaran 2d di dunia 3d itu pada dasarnya akan berfungsi sebagai silinder. Ini bisa menjadi cara yang nyaman untuk menciptakan area jika ketinggian tidak terlalu penting.
Radius berorientasi peristiwa
Jika volume peristiwa (baku tembak, gerakan ...) rendah, Anda dapat mencoba mendeteksi setiap aktor yang terpengaruh oleh setiap peristiwa. Acara Anda akan menghasilkan area (di mana mereka dapat didengar).
Ini adalah metode paling sederhana untuk diterapkan, itu juga yang paling fleksibel karena Anda dapat mengambil dampak peluru / proyektil yang berasal dari aktor di luar area kesadaran.
Di sisi lain begitu volume acara meningkat, Anda mungkin harus mengurangi jumlah acara yang memicu pemindaian area atau mengurangi jumlah aktor yang dipindai per peristiwa.
-> Anda juga dapat membuat zona kecil (acara) tempat semua acara didaftarkan bersama dan diproses dalam bulks (yaitu 2 dampak peluru dan langkah kaki yang terjadi dalam satu zona hanya akan menggunakan satu pemindaian dan dikirim ke semua entitas yang terkena dampak). <-
Area berorientasi aktor
Anda dapat menggunakan prinsip "area kesadaran". Yaitu jika seorang aktor bertabrakan dengan bidang kesadaran (lingkaran) aktor lain Anda cukup menambahkan aktor bertabrakan ke daftar aktor yang berpotensi berinteraksi. Tergantung pada bagaimana mesin Anda dibangun, Anda kemudian dapat mendaftar untuk pesan suara dan acara lain yang berasal dari aktor dalam daftar.
Untuk memeriksa kontak visual, Anda juga dapat melakukan pemindaian visual hanya pada daftar aktor terdaftar.
Anda tidak perlu memeriksa perubahan area kesadaran setiap centang. Anda dapat melakukannya dari waktu ke waktu, setiap 5 hingga 30 ticks misalnya.
Jika daftar mulai tumbuh Anda dapat membatasi mereka ke ukuran maksimum. Tetapi kemudian Anda harus memprioritaskan aktor untuk menambah / bertukar dalam daftar.
Pendekatan campuran
Anda dapat menggabungkan kedua pendekatan tersebut. Anda dapat mendaftarkan aktor di area kesadaran untuk acara seperti langkah kaki, hidung mesin, dll ... Dan acara lainnya (dampak proyektil, ledakan, dll ...) dapat memicu pemindaian berdasarkan kepentingannya. Ada kemungkinan jauh lebih tinggi seseorang akan mendengar ledakan granat daripada dampak peluru, sehingga ledakan granat akan memicu pemindaian yang lebih luas daripada dampak peluru.
Saya akan merekomendasikan Anda mulai menerapkan radius acara terlebih dahulu. Setelah ini berhasil dan Anda dapat mengurangi / meningkatkan ketepatan metode ini sesuka hati Anda dapat mulai menerapkan area kesadaran aktor. Dengan cara ini Anda akan dapat mulai memindahkan beberapa acara ke sistem kedua.
Kolam konteks
Tidak semua aktor perlu diberitahu tentang semua peristiwa. Misalnya menara Anti-Pesawat tidak perlu diberitahu tentang dampak peluru dan langkah kaki di sekitarnya, bahkan keberadaan unit darat dapat diabaikan untuk beberapa unit.
Jika Anda menemukan banyak kasus khusus seperti itu, Anda dapat membuat kumpulan area kesadaran yang berbeda. Seorang aktor dapat membuat area kesadarannya aktif di beberapa kolam. Misalnya, Anda mungkin ingin unit darat Anda bereaksi hanya pada unit darat sementara beberapa unit rudal dan laser dilengkapi dengan unit udara. Pesawat tidak perlu diberitahu tentang dampak tanah selain ledakan ...
Tentu saja Anda tidak perlu membuat beberapa "daftar" untuk kumpulan. Anda cukup menggunakan topeng bit dan mengatur topeng yang tepat untuk setiap aktor / area. Dengan cara ini Anda dapat memfilter dengan sederhana atau sebelum memeriksa jarak.
Pengumpulan
Jika Anda melihat daftar di setiap bidang kesadaran tumbuh dan memori langka, Anda dapat mengumpulkan bidang kesadaran untuk kelompok musuh (tim, regu, peleton, kawanan, kawanan ...) selama mereka tetap dekat satu sama lain. Dengan cara ini seluruh regu dapat mendaftar untuk acara atau aktor / kelompok lain yang memasuki area kesadarannya.
Pada dasarnya entitas grup menjadi pengganti / proxy untuk semua pemindaian sementara semua anggota grup dihapus dari kumpulan.
Prinsip ini juga dapat diterapkan untuk semua unit di dalam kendaraan.
Aktivasi kedekatan
Jika server benar-benar kelebihan populasi dengan bot (dan Anda benar-benar harus menjaga semuanya tetap hidup), maka Anda hanya dapat mengaktifkan kewaspadaan / AI pada mereka yang berada dalam "area aktivasi khusus di sekitar setiap pemain". Dengan cara ini bot (atau grup) di dalam satu atau lebih area aktivasi menjaga diri mereka sendiri dan area kesadaran mereka diaktifkan (di kolam tabrakan). Kalau tidak, area kesadaran mereka dihapus dari kumpulan area aktif.
Frekuensi di mana "area aktivasi" memindai "area kesadaran" dapat bervariasi tergantung pada kecepatan pemain. Seorang pemain yang bepergian dengan kecepatan lebih tinggi akan memicu lebih banyak aktivasi daripada pemain yang berkemah di suatu zona (setidaknya diperlukan untuk mengaktifkan bot jelajah dan menonaktifkan bot yang meninggalkan daerah itu).
Anda juga dapat menonaktifkan area aktivasi pemain jika ia naik kendaraan dan menetapkan area aktivasi untuk kendaraan jika tidak ada. Dengan cara ini 10 pemain yang bepergian dengan kendaraan yang sama tidak perlu memiliki 10 area aktivasi.
Delegasi
Jika Anda tidak takut curang dan pembuat masalah lainnya, Anda dapat mendelegasikan beberapa deteksi acara ke aplikasi klien.
Server dapat secara berkala mengirim daftar aktor terdekat (bot dan pemain) yang akan diberitahukan oleh aplikasi klien. Aplikasi klien harus melakukan pemindaian dan deteksi peristiwa untuk semua peristiwa yang dihasilkan oleh pemain. Misalnya dapat mengirim daftar aktor untuk memberi tahu tentang tembakan, dampak peluru atau langkah kaki.
Ini adalah opsi, ini bisa valid tergantung pada jenis permainan yang Anda buat. Ini adalah ide teoretis dan saya tidak akan merekomendasikan melakukan ini sampai Anda memiliki kontrol penuh atas klien yang didelegasikan (server bot atau klien aman).
Saya harap ini membantu.
sumber