RTS Oyun AI Konu


14

Sıfırdan gerçek zamanlı bir strateji oyunu yapmak için bir projem var. Hala erken planlama aşamasındayım ama mekaniği görmek için biraz program yapıyorum.

Nasıl programlayacağımı biliyorum. Ayrıca, bilgisayar sınıfları için oyun sınıflarını ve Kural Tabanlı (durum makinesi) yapay zekayı nasıl yapılandıracağım konusunda iyi bir fikrim var.

İzci, Görev Yolunu Takip Et, Pozisyonu tut (yaklaşan düşmanlara saldır veya bunalırsa geri çekilme) gibi belirli bir birime belirli bir davranış kazandıracak (ancak aynı anda birçok birimde kullanılabilir) Doktrinler geliştirmek istiyorum. , vb...

Doktrinler sadece birimler için geçerli olacak, bu yüzden bir birim perspektifi olacak ve tüm harita durağanlığından haberdar olmayacaklar.

Bilgisayar yapay zekası tüm görünür haritayı analiz edecek ve başka bir kurallar kümesine bağlı olarak her birime hangi sostrinin atanacağına karar verecektir.

Bunu OpenGL ile C # yapıyorum.

Şimdilik, ana düşünceme başlamadan önce testlerde çok fazla şey yok, sadece birkaç şey var. Tüm oyun işleme (güncelleme mouvement, mücadele, render, vb, birbiri ardına arayacağım) bir oyun döngüsü var, Application.Idle olayı çok sık çağrılır.

Şimdi merak ediyordum. Oyun döngüsünde işlenecek çok şey olacağından, Bilgisayar AI ve Birimler bu döngüdeki eylemlerini seçmeli mi yoksa çok yavaş mı olacak?

Her şeyin aynı anda olmasını istiyorsam, bilgisayar AI için ayrı bir iş parçacığı oluşturmalı mıyım? Ya da her ünite için ayrı bir iplik mi?

Çoklu iplik geçirme konusunda fazla deneyimim yok. Bunun için en iyi yaklaşım ne olurdu?


İlgisiz - OpenGL yerine Ogre3D mi?

Aslında hayır, hiç duymadım. OpenGL kullanıyorum çünkü derslerimde bana öğretilen buydu. Ogre3D 2D de yapabilir mi? Sanırım yapabilir, ama asla bilemeyiz ...

Evet, kendi GUI araç setine (cegui) bile sahip olabilir. Örneğin, TorchLight onunla oluşturulmuştur. Size zaman kazandırabilir, çünkü OpenGL'yi güzelce sarar. ogre3d.org/tikiwiki/MOGRE

"Ya da hatta her ünite için ayrı bir iplik" Cehennem hayır. Bir ipliğin yükü çok büyük. Birincisi, iş parçacığının yığını için ayrılmış bellek vardır (varsayılan olarak 1MB). İplik anahtarları da pahalıdır.

Yanıtlar:


3

"Sıfırdan" ne anlama geliyor? DirectX yerine XNA gibi bir şey kullanabilir misiniz?

Sıvı hareketi için saniyede 30 ila 60 kare arasında bir şey oluşturmalısınız. Gerçekten daha fazla fps'ye gerek yok.

Rendering + mantığı, 60 fps'nin verdiği 16ms'den daha az zaman alırsa, AI iş parçacığına gerek yoktur.

Çerçeveleri oluşturma arasında yeterli zamanınız yoksa, her kareyi nelerin güncellenmesi ve nelerin güncellenmemesi gerektiği konusunda çok dikkatli düşünmeniz gerekecektir .

"Doktrinler" bölümünün, en azından görünür birimler ve yakındaki diğer birimler için her kareyi güncelleyebilmesi için olabildiğince basit ve verimli olması gerektiğini tahmin ediyorum. Görünür birimleri doğrudan etkilemeyen birimler daha az sıklıkla (ve buna bağlı olarak daha büyük bir delta T ile) güncellenebilir.

Ana AI, haritadaki tüm birimleri işlemek ve bir strateji bulmak zorunda olduğu için daha fazla çalışmaya sahiptir, bu nedenle hesaplama süresinin çoğunu gerektirmelidir. Ayrı bir konu için ilk adaydır.

İkisi arasına başka bir katman eklemek isteyebileceğinize dikkat edin. Temel olarak, her birimin AI'si, birimin acil duruma "akıllıca" yanıt verdiğinden emin olmalıdır, bu yüzden hızlı ve duyarlı olması gerekir. Kadro AI, ekibin bir nehri geçmesi gerekiyorsa bir köprü bulmak gibi, birkaç saniyeye yayılan birkaç birimin "akıllı" eylemlerinden sorumludur. Ve ana AI, birçok ekibin eylemlerini uzun bir süre boyunca yönlendirmelidir.

Özellikle çok fazla deneyiminiz yoksa, gerekmiyorsa iplik geçirmeyin. Ekstra bir yük olmadan olduğu için bu karmaşık olacaktır. Ayrı bir proje olarak mulithread öğrenmek ya da bir tamamladıktan sonra bu bir bir uzantısı olarak yapabilirsiniz çalışma durumuna. İyi şanslar!


0

AI için ayrı bir iş parçacığına sahip olun. Ancak her birim için değil, çünkü çok fazla işletim sistemi kaynağı tüketecek ve senkronizasyon bir kabus olacaktır.

AI iş parçacığının yürütme fırsatı bulacağından emin olun. Hafifçe almayın, ana iplik çok fazla şey yaparsa, bu fırsatı asla bulamayabilir! AI iş parçacığına daha yüksek öncelik verirseniz, oyun yanıt vermez hale gelir, bu kabul edilemez.

Bu nedenle, ana döngüde senkronizasyon noktalarını ve / veya olayları dikkatlice seçin ve ana iş parçacığı dururken AI iş parçacığının hesaplamalarını tamamlamasına izin verin. Örneğin, kullanıcı birimi başka bir AI birimi görürse, senkronize edin, böylece biriminiz güncellenmiş bir birimi görür.


0

Ayrıca sıfırdan bir RTS oyunu üzerinde çalışıyorum. Henüz test etmedim, ancak benim fikrim, oyuncu tarafından şu anda görünen tüm birimler için ana oyun döngüsünde AI birimi çalıştırmaktı (ekranın oyuncunun gerçekten gördüğü veya ekranın kenarına yakın bir bölümünde) ), oynatıcının ekranı biraz hareket ettirmesi daha olasıdır.

Diğer birimler ayrı bir iş parçacığında kontrol edilir ve iki önceliğim vardır: 1. Ekranı oraya taşırsa kullanıcının görebileceği yerlerdeki birimler. 2. Gizli bölgelerdeki birimler (henüz keşfedilmemiş ve "savaş sisi").

Saniye önceliğindeki birimler için, döngüyü daha az çalıştırırım ve gerektiğinde geriye doğru hareket ettirerek telafi ederim.


1
Kulağa çok karmaşık geliyor.

Ana oyun döngüsüne birimlerin girip çıkmasıyla ilgili ilk bölüm dışında fikriniz iyi görünüyor. Tüm AI x, düşük öncelikli birimlerde her yinelemeyi atlamayı seçebileceğiniz kendi döngüsünde yapılmalıdır .
Olhovsky

0

Çok iş parçacığına ihtiyacınız olsun ya da olmasın, yapay zekayı çok iş parçacığına hazırlamak iyi bir fikir olabilir.

Ana iş parçanız dünyayı güncelleyecek, fiziği vb. İşaretleyecek ve daha sonra yapay zekanın dünya görüşünü temsil eden bir veri yapısını dolduracaktı: birimlerin konumu, kaynakların durumu, vb. Bu veri yapısı daha çok ana sistemleri önbelleğe alacaktı onlara işaret etmek yerine. Buna bazen senkronizasyon noktası denir.

Bu veri yapısını AI'ye aktarın ve sadece bu yapının içeriği üzerinde düşünmesine izin verin. AI'nın daha fazla bilgiye ihtiyaç duyduğunu görürseniz, yapıya ekleyin. Yapay zeka açısından buna genellikle karatahta denir ancak önbellek olarak da adlandırılabilir. AI'nın önbelleğe yazmasına asla izin vermeyin, çıktı ayrı bir veri yapısından gelmelidir.

Bu kurulum, oyunu paralel hale getirmenize izin verecektir, çünkü AI artık diğer oyun sistemlerine doğrudan bağımlı değildir. Bu sistemlerin güvenli olması gerekmez ve asla kilit almamalısınız. AI uzaklaşırken oluşturucuyu veya başka bir şeyi güvenle çalıştırabilirsiniz.

İkincil bir fayda olarak, gelecekte diğer sistemlerden aldığınız bilgileri çürüterek, kesin bilgi yerine belirsizliği simüle ederek önbelleği genişletebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.