Cüce Kalesi, performans kaybetmeden bu kadar çok varlığı nasıl takip eder?


79

Cüce Kalesi'nde, her biri kendi karmaşık AI ve yol bulma rutinleri olan herhangi bir zamanda oyunda yüzlerce Cüceler, hayvanlar, goblinler, vb. Olabilir. Benim sorum şu, nasıl gözle görülür bir yavaşlama üretmiyor? Her cüce kendi dişinde mi çalışıyor?


6
İlginç soru. Her ne kadar bu cümlecikten hoşlanmadığım halde, bu soruyu dile getirdiği gibi cevaplamak spekülasyon olurdu. Her neyse, bu makaleyi Tarn Adams ile konuşurken görmüş olabilirsiniz . Yol bulma işlemlerini kısaca anlattıkları yer.
MichaelHouse

25
Bu kesinlikle bir kompleks tünel topoloji ve 100+ cüceleri bir kez belirgin yavaşlama olduğunu üretir.
Russell Borogove

3
Evet, açıkladığım senaryoda deneyimimdeki DF inanılmaz derecede yavaş.
argentage

4
Birincil merdiven boşluğunu imha edin ve bir cüce gibi bir kare gibi damla düşerken seyredin, her cüce aynı anda öfkelenir.
Mooing Duck

2
İçeri gireceğim ve DF'nin en iyi örnek olmadığını kabul edeceğim; Aslında, DF'nin performans sorunları yaşadığı bilinmektedir.
Robert S.

Yanıtlar:


110

Bu kadar çok karakterden her biri için bir iş parçacığı olan herhangi bir sistemde çok hızlı bir şekilde kaynak tükenir. İş parçacığı size ekstra işlemci çekirdeği erişimini sağlayabilir, ancak kendiliğinden daha verimli bir şey yapmazlar ve başlarına gelirler.

Basit cevap, oyunda her varlık işleme konusunda verimli olmaktır.

  • Her varlığı her kareyi işlemeyin.
  • İşlemeyi, sık sık yapılması gereken ve sık sık yapması gerekmeyen şeylere ayırın.
  • Diğer sistemlerde işlemeyi engellememeleri için uzun süre çalışan algoritmaları birden fazla kareye dağıtın.
  • Verimli algoritmaların ve veri yapılarının kullanıldığından emin olun.
  • Tekrar kullanılması muhtemel ise pahalı hesapların sonuçlarını önbelleğe alın.

2
Bunun için +1, gerçekte neler olduğunu açıklamak için değil, benim gibi grafiklerle uğraşmak yerine. :)
Matt Kemp

4
Adil olmak gerekirse, ben de size +1 verdim, çünkü bu yönü unuttum ve bu çok doğru - gfx'i denklemden çıkarın ve bilgisayarları anında 2x veya 3x daha hızlı hale getirmek gibi.
Kylotan

DF'nin artık çok iş parçacığı olduğunu duydum, ancak en azından yakın zamana kadar hepsi tek bir iş parçacığında yapıldı. (Hala olabilir, emin değilim)
Mooing Duck

@MooingDuck Hala değil.
Tharwen

63

Cüce Kalesi açık kaynak değildir ve tüm işlerin nasıl yürüdüğünü belirleyebilecek çok fazla varsayım ve tersine mühendislik varken, bunun yerine, bir 3D (3D grafik, 3D dünya) roguelini optimize etmek için bazı temel tekniklere odaklanacağım. aynı tip.

Tüm video oyunlarında olduğu gibi, karmaşıklık yanılsamasını basit kural ve sistemlerden yaratan çok fazla duman ve ayna vardır. Bunlar, yolsuzluk hareketi için basit rasgele sayılar kullanmaktan, yol bulma için üst düzey bir düğüm ağını önceden pişirmeye kadar uzanır.

hareket

Yol bulma hakkında konuşursak, bu genellikle bir DF haritası gibi büyük alanlar için çözülmesi zor bir problem olabilir (768x768x64 IIRC'ye kadar), ancak problem şu şekilde basitleştirilebilir ve hızlandırılabilir:

  • Önceden pişirilmiş düğüm ağı: Harita oluşturulduğunda dünya, parçalara bölünebilir ve her bir parça kendi çıkışlarını ve girişlerini haritalandırabilir. Bir duvar inşa edildiğinde olduğu gibi bir yığın güncellendiğinde, yalnızca bu yığının ağının güncellenmesi gerekir.
  • Aşamalı Yol Bulma: Hücre için tüm harita üzerinde bir yol çalıştırmak, hücre için çok fazla zaman alacaktır, bunun yerine, büyük parçalar arasındaki ağ yolunu bulursunuz; öbekten ötekine geçiyor. Bu sizin için 2 şey yapar. Bir çok küçük parçaya bölünerek yol bulmayı hızlandırır ve bir yığın güncellendiğinde ünitenin yol boyunca yol boyunca yön değiştirmesini sağlar. Güncelleştirmeyi geçmesi gereken düğümlerden herhangi biri olması durumunda, büyük ağ üzerinde yeniden yol alacaktır.
  • Rastgele direksiyon: Bir hedefe giderken, ünitenin sadece amaçsızca yürümesi gerekir. Birçok roguelik, üniteyi rasgele bir yöne hareket ettirir, bu doğal olmayan bir şeydir. Çeşitli direksiyon teknikleri kullanılabilir, basit olanlar düz bir çizgide hareket etmeyi tercih eder ve sadece% 1 şansı olacak olan, arkaya yayılan yönlerde hareket etme şansı daha az ve azdır. Böylece ünite bazen yönü tamamen tersine çevirir, ancak nadiren.

Ben yol bulmanın temellerini örtmeyeceğim. Çoğu roguelikes A * kullanır, ancak kediyi kaplamanın başka yöntemleri de vardır. Mmmm Cat deri ..

Kişisel Görevler

DF birimlerini pop ve canlı hissettiren en önemli şeylerden biri kişisel hedef listesidir. Gerçekte, birçok roguelike oyun bu temel düzeyde var. Temel olarak, her birim bir arzu listesine sahiptir (ve dorf'larınız için, yapmayı isteyeceğiniz görevler olabilir) ve kişiliklerine göre (statüler) onlardan seçecektir.

Bazı görevlerin gereksinimleri vardır. Deri bir etek yapmak için dorf, X öğelerine sahip bir dükkanda olmayı gerektirir. Böylece hepsi kontrol edilir ve görevlerine görev olarak eklenir. Bu kadar basit.

Bir birimin transit olacağı çoğu zaman, hangi birimlerin yapıldığına dair kontroller çok hızlı olabilir, herhangi bir anda sadece birkaç birim bir seçim yapacaktır ve bu nedenle genel olarak yüzlerce süre boyunca yavaşlama olmaz. binlerce birim. Unutmayın, DF'de arılardan başböceklerine kadar ağaçlara kadar her şey birimlerdir.


Bazı ek araştırmalar yaparken, DF'nin, genel olarak korkunç bir yol bulma işi yaptığı açıktır. Haritayı parçalara ayırmıyor, haritayı bağlı olan bölümlere veya alanlara bölüyor, (ki bu kesinlikle hiçbir şeyden daha iyi değil), bu yüzden yukarıdaki değerlendirmem, DF'nin düşündüğümden daha iyi çalıştığını gösteren bir örnek. :) DF'nin milyonlarca nedenden ötürü şaşırtıcı olmayan bir şey olduğu söylenemez.

Bir oyunda önemli olanın oyun olduğunu göstermek için gider. Grafik değil, harika programlama, harika yazma, harika müzik değil, arayüz bile değil; oyunun kendisi kadar önemli bir şey bile% 1 kadar önemli değil.


1
1024X1024X32? Dikey 128 ya da 256 sanırım. 32'den çok daha büyük.
Lawton

@ Lawton Maksimum boyut konusunda hatalı olduğuma inanıyorum, ancak yükseklik o kadar yanlış değil. Düzeltiyorum. Oyunu yükledim ve bulunduğum başlangıç ​​sadece 45 seviye yükseklikte. Daha fazlası 'taklit' olabilir, ancak kazma veya inşaat için onlara erişimim yok.
DampeS8N

@ DampeS8N Az önce modüle edilmemiş, orta bir haritayı yükledim ve +16 ila -156 arası, yaklaşık 180 seviye görüntüleyebildim. Kural olarak, 40 seviye haritaları istisnadır. Bir akifer veya lav tarafından engellendiği için sadece 40 tanesini kazabilseniz bile, bunun önemi yoktur, çünkü altındaki alan hala simüle edilmiş eğlence ile doldurulur.
Lawton

@Lawton, haritam sadece 45 seviyeye kadar sayfa yapmama izin veriyor. Kesinlikle değişkenler ama her bir haritanın kaç tanesinin erişilebilir olduğu ile ilgili sayıları kolayca bulamadım. Ayrıca kullandığımız oyunun hangi sürümüne bağlı olabilir. Sonunda cevabım için bu kadar önemli değil.
DampeS8N

Eski bir direk ama cüce kaledeki derinlikler tortul tabakalara bağlı. Yer kabuğunun bazı yerlerde daha kalın olması gibi. DF tamamen jeolojik olarak doğru değildir, ancak profesyonellerin yaptığı gibi çalışmaktadırlar: D.
Madmenyo

50

Gönderen bu sayfada :

Eh, [yol bulma] benim açımdan inanılmaz görünüyor, çünkü hepsini aynı anda yapan bir metrik ton karakter var.

TA: Cüceler kendileri çoğunlukla eski sokak mesafesi sezgisel olarak, A * ile hareket ederler. İşin zor yanı, önceden oraya ulaşabileceklerini bilmiyorlarsa gerçekten A * diye arayamayacakları ya da haritayı su basar ve işlemciyi öldürürler.

Bunun kesinlikle “haritayı su basmasını” nasıl önlediğini bilmiyor muyum , ancak oyunlarda bunu yapmanın genel yolu, Hierarchical Path-Finding A * veya HPA * olarak adlandırılan A * değişikliklerini kullanmaktır . Fikir, ızgarayı daha az sayıda ama daha büyük parçalara bölmek, ardından her bir yığından komşu parçalarına giden en iyi yolu bulmak için A * 'yı kullanmaktır. Bunu, her ünite için A * 'nın çalıştırılacağı daha küçük bir grafik oluşturmak için kullanabilirsiniz.

Hiyerarşik yol bulma

Bu parçaları, "hiyerarşik" nin geldiği yer olan daha büyük boyutlarda da gruplandırabilirsiniz.

Bu algoritma sadece en uygun yolları bulur, fakat genellikle sorun olan Cüce-Kale gibi oyunlar için. Varsa hala bir yol bulması garanti edilir; ve hiçbir yol olmadığında, sadece küçük grafiği doldurur ve çok fazla zaman kazanır.

Ayrıca, bazı arazilerden geçebilecek, ancak diğerleri dışında (hava birimlerinin geçebileceği, ancak zemin birimlerinin yapamayacağı uçurumlar gibi) birimlerle ilgilenen bir HPA * soyutlaması da vardır . Buna HAA * deniyor ve burada açıklayan çok erişilebilir bir makale var .

Burada çeşitli yol bulma algoritmaları hakkında daha fazla bilgi edinebilirsiniz .


3
Bu videoyu RimWorld geliştiricisinden çok aydınlatıcı buldum. Sadece 2B iken, benzer bir oyun. Yol araştırmanın arkasındaki temelleri ve haritayı bölgelere ayırmanın yararlarını açıklar. youtube.com/watch?v=RMBQn_sg7DA
Sire

18

Eğer bir şey varsa, tam tersidir - her şey tek bir iplik üzerinde çalışır ve şimdi bunun engelleyici faktör haline geldiği noktayı vurmaktadır (son kontrol ettiğimde!)

Hızlı olmasının nedeni süslü grafiklerin olmaması. Aldatıcıdır, ancak işleri yavaşlatan en önemli şey şeyleri çizmektir (AAA başlıklı bir karenin üçte ikisini yukarı doğru düşünün). Cüce kalesi oldukça basit olduğundan, o zamanın geri kalanını ilginç şeyler yapmaya adamıştır.


8
Bunun lehine olan bir veri noktası, OpenGL'nin bir süre önce yeniden yazıldığını hatırlıyorum ki büyük bir kare hızı artışı getirdi. Böylece DF'nin verimli bir şekilde etkilediği basit grafik grafikleri bile yapıyor.
millimoose

3
+1 Şerit grafikleri = oyun hesaplaması için çok fazla boş zaman
Laurent Couvidou

2
DF grafiklerinin herhangi bir modern indie 2D oyun kadar zorlayıcı olduğuna dikkat etmek önemlidir. Küçük ve basit olsalar bile birçok doku vardır ve gayrimenkulün full HD monitörlerine yayılabilirler. Gösterişli parçacık etkisi ya da neyin var, ancak ham "tüm bu pikselleri boya" işi hala mevcut değil ve küçük karo boyutları için gerekli olan çekme çağrılarının sayısı nedeniyle performans yapmak gerçekten büyük bir zorluk.
DampeS8N

İlk başta saçma bir cevap gibi görünebilir, ancak bu doğrudur, karmaşık ilkelleri, açmaları, dokuları çizmeniz, 3B vektörleri dönüştürmeniz gerekmiyorsa 4-12gb gram ve 4-12tflops GPU gücüyle neler yapılabileceğini hayal edin 2 d piksel, gölgelendirici vb. dizisi
Felype

10

DF'nin nasıl kodlandığını bilmiyorum ama AI'lerin miktarı beni gerçekten etkilemiyor, çünkü insanların AI'nın hassasiyetine ihtiyaç duymadığını sıklıkla denetliyorlar . Çoğu şeyi yalnızca birkaç saniyede bir yapmak oldukça uygun. Ayrıca kesin olmayan hesaplamalar kullanmak da geçerlidir. Kusurluluk, çok fazla performans kazandırır . Her 100 ms'de 100 birim karar verme rutinini çalıştırabilir veya her saniyede 1000 birim çalıştırabilirsin, aynı miktarda CPU zamanı alacaktır, ama iyi ... 10 birime sahipsin.

İşte size bir çok birimi nasıl idare edebileceğinin basit bir örneği:

int curUnit;
Array<Unit> units;
[...]
while([...]) // Game Loop
{
  [...game logic...]
  // process 10 AIs per Frame
  for(int i=0; i++; i<10)
  {
    curUnit++
    if(curUnit == units.length()) curUnit=0;
    if(curUnit < units.length())
      units[curUnit].processAI();
  }

  // Update the position of all units, this should be as optimized as possible
  foreach(Unit& unit in units){ unit.move(); };

  [...graphics...]
}

AI ne kadar fazla olursa o kadar az tepki gösterecek, fakat oyuncu ancak zor durumlarda farkedecektir.


Kare düzeyinde kesin olmayan görev yığınlarından geçmek için söylenecek çok şey var. AAA oyunları genellikle her bir departmanın her bir karenin yüzdesini açıkça gösterir; böylece bir bölüm diğer bölümlerin ayak parmaklarına basamaz. Ağaçların canlandırılması için kullanılan metot rüzgar hızına ve yönüne bağlı olarak yavaş ise, diğer takımların bütçesini tüketmek yerine daha az sayıda ağaç işlenecektir.
DampeS8N
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.