RTS Game AI Thread

14

Saya punya proyek untuk membuat game strategi real-time dari awal. Saya masih pada tahap perencanaan awal, tetapi saya telah sedikit pemrograman untuk melihat mekanik.

Saya tahu cara memprogram. Saya juga punya ide bagus tentang bagaimana saya akan menyusun kelas-kelas game dan AI berbasis aturan (mesin negara) untuk pemain komputer.

Saya ingin mengembangkan Doktrin, yang akan memberikan perilaku spesifik pada unit tertentu (tetapi dapat digunakan pada banyak unit pada saat yang sama), seperti Scout, Ikuti Rute Misi, tahan Posisi (serang musuh yang mendekat atau mundur jika kewalahan) , dll ...

Doktrin hanya akan berlaku untuk unit, sehingga akan memiliki perspektif unit, dan tidak menyadari situasi peta keseluruhan.

Computer AI akan menganalisis seluruh peta yang terlihat dan memutuskan soctrine yang akan ditetapkan masing-masing unit tergantung pada seperangkat aturan lain.

Saya melakukan ini di C # dengan OpenGL.

Untuk saat ini, saya tidak punya banyak, hanya beberapa hal dalam ujian sebelum saya memulai konsepsi utama saya. Saya memiliki loop game di mana semua pemrosesan game (di mana saya akan memanggil pembaruan pembaruan, pertempuran, rendering, dll, satu demi satu) akan terjadi, itu disebut sangat sering jika acara Application.Idle.

Sekarang, saya bertanya-tanya. Karena akan ada banyak hal untuk diproses di gameloop, haruskah Komputer AI dan Unit memilih tindakan mereka dalam loop itu atau akankah itu terlalu lambat?

Jika saya ingin semuanya simultan, haruskah saya membuat utas terpisah untuk AI komputer? Atau bahkan utas terpisah untuk setiap unit?

Saya tidak punya banyak pengalaman dengan multi-threading. Apa yang akan menjadi pendekatan terbaik untuk ini?

Nate
sumber
Tidak terkait - dianggap Ogre3D, bukan OpenGL?
Sebenarnya, tidak, saya tidak pernah mendengarnya. Saya menggunakan OpenGL karena itulah yang saya pelajari di kelas saya. Bisakah Ogre3D melakukan 2D juga? Saya kira itu bisa, tetapi kita tidak pernah tahu ...
Ya itu bisa, bahkan memiliki toolkit GUI sendiri (cegui). Misalnya, TorchLight dibuat dengan itu. Ini dapat menghemat waktu Anda karena membungkus dengan baik DI SEKITAR OpenGL. ogre3d.org/tikiwiki/MOGRE
"Atau bahkan utas terpisah untuk setiap unit" Ya ampun. Overhead utas terlalu besar. Untuk satu ada memori yang dicadangkan untuk tumpukan utas (1MB secara default). Dan switch thread juga mahal.

Jawaban:

3

Apa artinya "dari awal"? Bisakah Anda menggunakan sesuatu seperti XNA sebagai gantinya dengan DirectX?

Anda harus merender sesuatu antara 30 dan 60 frame per detik agar memiliki gerakan yang lancar. Benar-benar tidak perlu memiliki lebih banyak fps.

Jika rendering + logic kurang dari 16ms yang diberikan 60fps kepada Anda, maka tidak perlu ada utas AI.

Jika Anda tidak akan memiliki cukup waktu antara merender frame maka Anda harus berpikir dengan sangat hati-hati tentang apa yang harus diperbarui setiap frame dan apa yang tidak.

Saya memperkirakan bahwa bagian "doktrin" harus sesederhana dan seefisien mungkin sehingga dapat diperbarui setiap frame, setidaknya untuk unit yang terlihat dan unit lain di dekatnya. Unit yang tidak mempengaruhi unit yang terlihat secara langsung dapat diperbarui lebih jarang (dan, dengan demikian, dengan delta T yang lebih besar).

AI utama memiliki lebih banyak pekerjaan yang harus dilakukan, karena ia harus memproses semua unit pada peta dan mencari strategi, sehingga harus membutuhkan sebagian besar waktu perhitungan. Ini adalah kandidat pertama untuk utas terpisah.

Perhatikan bahwa Anda mungkin ingin menambahkan lapisan lain di antara keduanya, sesuatu seperti AI tingkat skuadron. Pada dasarnya, masing-masing unit AI harus memastikan unit merespons "secara cerdas" terhadap situasi langsung, sehingga perlu cepat dan responsif. Skuad AI bertanggung jawab atas tindakan "cerdas" dari beberapa unit, tersebar di beberapa detik, seperti menemukan jembatan jika skuad perlu menyeberangi sungai. Dan AI utama harus mengarahkan tindakan banyak regu selama periode waktu yang lama.

Terutama jika Anda tidak memiliki banyak pengalaman, jangan melakukan threading jika Anda tidak perlu. Ini akan rumit karena tanpa beban tambahan. Anda dapat mempelajari multithreading sebagai proyek terpisah, atau sebagai perpanjangan dari proyek ini setelah berada dalam kondisi kerja . Semoga berhasil!


sumber
0

Punya utas terpisah untuk AI. Tetapi tidak untuk setiap unit karena akan menghabiskan terlalu banyak sumber daya OS dan sinkronisasi akan menjadi mimpi buruk.

Pastikan utas AI akan menemukan peluang untuk dieksekusi. Jangan menganggap enteng, jika utas utama melakukan terlalu banyak hal, itu mungkin tidak akan pernah menemukan kesempatan itu! Jika Anda hanya memberi prioritas lebih tinggi pada utas AI, maka gim tersebut menjadi tidak responsif, yang tidak dapat diterima.

Jadi, pilih dengan hati-hati titik sinkronisasi dan / atau peristiwa dalam loop utama dan biarkan utas AI untuk menyelesaikan perhitungannya sementara utas utama berhenti. Misalnya, jika unit pengguna melihat unit AI lain, sinkronkan, sehingga unit Anda melihat unit yang diperbarui dan sebaliknya.


sumber
0

Saya juga mengerjakan game RTS dari awal. Saya belum mengujinya, tetapi ide saya adalah menjalankan unit AI di loop permainan utama untuk semua unit yang saat ini dapat dilihat oleh pemain (di bagian layar yang benar-benar dilihat oleh pemain atau di dekat perbatasan layar itu) ), karena lebih mungkin bahwa pemain akan sedikit memindahkan layar.

Unit lain diperiksa dalam utas terpisah, dan saya memiliki dua prioritas: 1. Unit yang ada di tempat-tempat yang terlihat oleh pengguna jika ia memindahkan layar ke sana. 2. Unit yang berada di area tersembunyi (belum dieksplorasi dan "kabut perang").

Untuk unit dalam prioritas detik, saya menjalankan loop lebih jarang, dan menggantinya dengan memindahkannya secara retrospektif bila diperlukan.


sumber
1
Kedengarannya sangat rumit.
Ide Anda terdengar bagus kecuali untuk bagian pertama tentang memindahkan unit ke dalam dan keluar dari loop game utama. Semua AI harus dilakukan dalam loop itu sendiri, di mana Anda dapat memilih untuk melewati loop setiap xiterasi pada unit prioritas rendah.
Olhovsky
0

Apakah Anda perlu multithread atau tidak, mungkin ide yang baik untuk mempersiapkan AI untuk multithread.

Utas utama Anda akan memperbarui dunia, menandai fisika, dll, dan kemudian akan mengisi struktur data yang mewakili pandangan AI tentang dunia: posisi unit, keadaan sumber daya, dll. Struktur data ini akan menembolokkan sistem utama, alih-alih dari sekedar memegang petunjuk untuk mereka. Ini kadang-kadang disebut titik sinkronisasi.

Kirim struktur data ini ke AI, dan hanya izinkan untuk alasan pada isi struktur ini. Jika Anda menemukan AI membutuhkan lebih banyak informasi, tambahkan ke struktur. Dalam bahasa AI ini sering disebut papan tulis tetapi juga bisa disebut sebagai cache. Jangan biarkan AI menulis ke cache, output harus datang melalui struktur data terpisah.

Pengaturan ini akan memungkinkan Anda untuk memparalelisasi game karena AI tidak lagi memiliki ketergantungan langsung pada sistem game lainnya. Sistem-sistem itu tidak harus aman dari threads dan Anda seharusnya tidak pernah mendapatkan kunci. Anda dapat dengan aman menjalankan penyaji atau sesuatu sementara AI berputar.

Sebagai manfaat sekunder, di masa mendatang Anda dapat menambah cache dengan meluruhkan informasi yang Anda dapatkan dari sistem lain seiring waktu, mensimulasikan ketidakpastian daripada pengetahuan yang sebenarnya.

tenpn
sumber