Crusader Kings III’te Performans ve Yapay Zeka

Crusader Kings III geliştirici günlüklerinde bu hafta oyun için yapılan Kullanıcı Testlerine dair bilgiler veriliyor.

Herkese merhabalar,

Ben Magne “Meneth” Skjæran, Crusader Kings III’teki programcılardan birisiyim. Beni CK2’deki ve Paradox Wiki’ler üzerindeki çalışmalarımdan hatırlayabilirsiniz, özellikle CK2’de performans ve yapay zeka odaklı bazı çalışmalar gerçekleştirmiştim. Bugün sizlere CK3’te bu iki alanda yaptığımız çalışmalardan söz edeceğim.

Performans

İlk olarak performanstan söz edelim. CK2’nin yaşam süresi boyunca performans odaklı çeşitli çalışmalar gerçekleştirdik, Holy Fury çıktığında CK2 performans olarak en iyi noktasına ulaşmıştı. Çıkış versiyonuyla bugünkü versiyon arasında karşılaştırma yaptığınız vakit çıkış versiyonunun çok daha yavaş olduğunu görüyorsunuz.

Paradox oyunlarında performans dediğimiz vakit CK2 diğerlerinden ayrışan bir oyun, bu da bu itibarı korumamız gerektiği anlamına geliyor. Bu sebeple CK3’ün geliştirilişinin başından bu yana performansın bizim için en önemli önceliklerden biri olmasıyla sonuçlandı. Sistemlere yaklaşımımız CK2’ye nazaran oldukça farklı ve bu farklı yaklaşım performans bazında oldukça iyi sonuçlar elde etmemizi sağladı.

Performansla ilişkili olarak CK2’ye nazaran farklı yaklaştığımız 2 sistem Threading ve Rendering. Bu ikisi birbiriyle oldukça ilişkili sistemler, öyle ki çoğu zaman birini cümlenize dahil etmeden diğerinden bahsedemiyorsunuz. CK2’de yaklaşımız oldukça basitti, oyun genel olarak “ana thread” üzerinden çalışıyordu. Ana thread’ın başlıca görevi oyun ilerledikçe oyunun gamestate’ini güncellemekti. Oyuncuların değişikliği görebilmesi için frame yenilemesi gerektiğinde belli aralıklarla gamestate’i yenilemeyi bırakırdı.

Gamestate güncellemeleri esnasında çok sayıda farklı türde işlem gerçekleştirilirdi, CK2’de bunların işleyişi genellikle karakterler etrafında şekilleniyordu. Karakterler için gündelik değişimler bu işlemlerin önemli bir kısmını tutuyordu mesela oyun içerisinde bir gün bir karakter diğer bir karaktere dair bilgi edinmemeliyken, bir başka gün diğer karakterlere görünebilen bilgilerde değişiklik yapamaz hale gelebilir. Bu kısıtlamalar bu güncellemelerin paralel bir şekilde yapılmasını zorunlu kılar, her Thread aynı karakterin farklı işlemini gerçekleştirir. Pratikte bu sistem CK2 için oldukça iyi işledi, CK2 birçok paralel işlemin birlikte yapıldığı ve bu yaklaşımdan performans bazında ciddi faydalar görmüş bir oyun. Benzer örnekler unvanlardan komplolara kadar oyunun farklı alanları için de verilebilir.

Ancak bu sistemin önemli dezavantajları da vardı. Bu dezavantajların en büyüğü her yamada programcıların neleri yapıp neleri yapamayacağına dair belli kural dizileri dayatılmasıydı. Bu kurallardan birini ihlal etmek oyunun OOS vermesine sebep olup oyunu multiplayerda oynanamaz hale getiriyordu. Kimi zaman bu tür kural ihlalleri oyunun çökmesine dahi sebep olabiliyordu. Eklediğiniz herhangi bir sistem oyundaki tüm karakterleri işlemden geçirmesini gerekiyorsa gereksiz yük oluşturduğu sebebiyle “bu yamada böyle bir şey eklememize gerek yok” denerek yamadan çıkarılabiliyordu.

CK3’te bu sistemi tamamen değiştirdik. Obje kademesinde paralellikten ziyade artık sistem kademesinde bir paralelliğe sahibiz. Birden fazla karakteri aynı anda işleme almaktansa, farklı sistemleri aynı anda işleme alıyoruz. Örneğin oyunda plan sistemiyle görüş sistemi aynı anda değişebiliyor, bu da yamalarda önümüze çıkan kuralların çok daha basit hale gelmesiyle sonuçlanıyor, bu paralellikte uymamız gereken yegane kural oyuncunun görebildiği bilgiler üzerinde değişiklik yapamamamız, bunun yerine bu değişikliğin bir süre sonra gerçekleşmesi. Bu kuralların basitleşmesi oyunda karşılaştığımız hata sayısının da, özellikle OOS hatalarının azalmasıyla sonuçlandı. Hangi işlemlerin paralel bir şekilde gerçekleşebileceğini CK2’ye nazaran daha net bir şekilde görebiliyoruz, bu da daha fazla işlemin eş zamanlı olarak gerçekleşebilmesine olanak tanıyor.

pasted_image_0.png

Bu durum CK3’te Rendering’e olan yaklaşımızla da oldukça iyi bir sonuç veriyor. CK3’te Rendering Ana Thread’de gerçekleştirilmektense kendisine has bir Thread’e sahip. Yine de Ana Thread ile senkronize bir şekilde hareket etmesi gerekiyor, bu sebeple bir kilit sistemine sahibiz. Render Thread’i gamestate’e erişim istediğinde, gamestate kendisini değiştirmesine izin vermiyor. Tıpkı CK2’de olduğu gibi gamestate belli aralıklarla Render’in erişim isteyip istemediğini kontrol ediyor, erişim istemesi durumunda işlemi ona bırakıyor. Buradaki büyük fark Render’in yaptığı işlemlerin büyük bir kısmının gamestate erişimine ihtiyaç duymaması, dolayısıyla gamestate ile paralel bir şekilde çalışabilmesi.

Biraz önce bahsettiğim kuralları hatırlıyor musunuz? Gamestate’e yapılan paralel güncellemeler görüneni değiştirme hakkına sahip değil, bu sebeple güncellemeler esnasında Render Thread’i de güncelleyebiliyoruz. Genele bakıldığında Render Thread’in “beklemesi gerektiği süre” oldukça az ve gamestate ile aynı çalışma süresine sahip. Şimdi elimizde halen obje kademesinde paralellik içeren bazı işlemler var, bunlardan en önemlisi yapay zeka. CK3’te yapay zeka gamestate üzerinde direkt olarak değişiklikte bulunamıyor, dolayısıyla yapay zeka ne yapması gerektiğini düşünürken Rendering devam edebiliyor.

Genel olarak bu değişiklikler CK3’ün CK2’den daha iyi Thread kullanımına sahip olduğu anlamına geliyor, bu da daha istikrarlı bir framerate’e sahip olacağımız, programcıların OOS veya oyunun çökmesine sebep olabilecek hataları daha zor yapacağı anlamına geliyor.

Threading’in yarattığı farkı görmeniz için basit bir test hazırladım, ilk olarak Threading’i tamamen aktifleştirip 1 dakikalığına oyunu çalıştırdım, ardından Threading’i kapatıp çalıştırdım. Farkı aşağıda görebilirsiniz, solda Threadingli, sağda Threadingsiz.

Videoda gördüğünüz kırmızı çizgi her frame arasında geçen süreyi temsil ediyor. 60 FPS’te yeşil çizgide veya bu çizginin altında yer almalı. Gördüğünüz üzere aradaki fark oldukça büyük. Threading olmadan framerate berbat bir durumda ve oyun çok daha yavaş ilerliyor. Threading ile oyun 958 gün ilerlerken, Threading olmadan sadece 546 gün ilerleyebildi. Bu durum Threading ile oyunun %75 daha hızlı olduğu anlamına geliyor.

Bu videoyu aldığım bilgisayar evdeki bilgisayarım, da i7 4770K, GTX 1080 ve 16 GB 2400 MHz RAM sahibiyim ve oyun en yüksek grafik ayarlarında çalışıyor. CPU ve RAM oldukça eski ve yeni modellerle karşılaştırıldığında artık geri kalmış modeller, öte yandan GPU oldukça iyi. Maksimum hız neredeyse hiç kullanmayacağım kadar hızlı, genellikle 3 veya 4 hızda oyunu oynuyorum.

Yukarıda bahsedilenlerin yanı sıra, peki CK3’te performansı nasıl geliştiriyoruz? Belli aralıklarla vaktimizin bir kısmını performans sıkıntılarına ayırıp, hangi alanlarda geliştirmelerde bulunabileceğimizi inceliyoruz. Bu genellikle Threading arttırması, mevcut sistemleri daha performans dostu olacak şekilde kodlamak şeklinde. Oyunu daha hızlı yapma yolları arasında favorilerimden birisi oyuncunun etkilenmeyeceği ağır hesaplamalarda değişiklikler yapmak. Örneğin oyuncunun konsey görevlerinin hangi aşamada olduğu her gün tekrar hesaplanıyor. Öte yandan yapay zeka için bu hesaplamayı aylık gerçekleştiriyoruz, oyuncunun buradaki farkı fark etmesi neredeyse imkansız, ancak bu şekilde bu ağırlığı 30’da 1’ine düşürmüş oluyoruz. Bu gibi optimizasyonlar CK3’ün (ve büyük oranda CK2’nin) birçok kısmında bulunuyor.

Yapay Zeka[/title]
Şimdi gelin biraz yapay zekadan bahsedelim. CK3’te yapay zekadan sorumlu şefimizin ismi Niklas “Captain Gars” Strid, kendisi şu an doğum izninde. Geçtiğimiz yaklaşık bir yıl boyunca kendisine çeşitli konularda yardım ettim ve kendisinin yokluğunda tüm sorumluluk bana kalmış vaziyette.

Yapay zekayı ben kodlamadığım için Niklas’ın yazabileceklerinden daha kısa bir yazı ortaya çıkacaktır fakat yine de CK3’te yapay zekayı nasıl ele aldığımızdan olabildiğince ayrıntılı bir şekilde bahsedeceğim.

Yapay zeka dendiğinde öncelikli hedefimiz oyunu oyuncu için daha eğlenceli hale getirmesi. Bunun gerçeğe dönüştürülmesi için elzem bazı maddelerimiz var:

  • Oyuncuyu zorlamalı, oyuncunun kartopu şeklinde büyüyerek önüne çıkanı ezmesi eğlenceli değil.
  • Daha “akıllıca” olsa bile, oyuncunun canını sıkacak şeyler yapmaktan kaçınmalı.
  • Ortaçağ dünyasının bir aktörüymüş gibi hissettirmeli.

Bu maddelerin hepsi birbiriyle çeşitli konularda kesişen maddeler, kimi maddelerin bizzat birbirlerine zıt gittiği noktalar da var örneğin oyununun canını sıkmayan yapay zeka genellikle oyuncuyu zorlamayan yapay zekadır, elbette bu noktada makul olan eylemi yapmak durumundayız.

CK3’te yapay zekaya dair en büyük farklardan birisi askeriyeyi yönetme biçimi. CK2’de bir tarafta birden fazla yapay zeka bulunduğu vakit her biri ayrı bir akılla hareket eder, aralarında çeşitli koordinasyon sistemlerine sahip olurdu. Bu durum genellikle iyi çalışsa da, kimi zaman müttefikler arasında kopmalara ve yapay zekanın tuhaf kararlar almasına sebep olabiliyordu.

CK3’te savaşta bir tarafta birden fazla yapay zeka olduğunda birliklerini savaş yöneticisine teslim ediyorlar ve tüm yapay zeka kararlarını bu yönetici alıyor. Tekil bazda kalan yegane karar yapay zekanın savaşa hangi birliklerini sokacağı (bu durum özellikle katılabilecekleri birden fazla savaş varsa etkili oluyor.)

Bu yönden yapay zekanın artık savaşlarda daha etkili hareket ettiğini göreceksiniz. Elbette bu sistem yapay zekanın oyuncu ile olan koordinasyon sıkıntısını çözmüyor, CK2’de yapay zekaya emir verdiğiniz bir sistem oluşturmuştuk. CK3’te bu sisteme sahip değiliz fakat yapay zeka oyuncuya yardım etme odağına sahip. Genel olarak yapay zeka ordularını oyuncuya yakın tutmaya ve eğer bir muharebe onun desteği olmadan kaybedilecek durumdaysa muharebede yardım etmeye çalışıyor. CK2’deki gibi yapay zekaya emir verilen bir sistem buradaki işleyişi daha da ileriye taşıyabilir fakat aradaki fark o kadar küçük ki çıkış versiyonunda önceliklerimizden biri olmadığına kanaat getirdik. Ek olarak CK2’de bu sistemin varlığı yapay zekanın geliştirilmesini bir hayli zor hale getiriyordu.

Şimdi, “oyuncuyu zorlamalı” kısmını geçtik peki ya can sıkıcı eylemlerden uzak durma? CK3’te bunu sağladığımız çok sayıda küçük mekanik var fakat başlıca örneklerden birinden bahsetmek gerekirse CK3’te yapay zeka “Dur ve Savaş” adını verdiğim bir sisteme sahip. Eğer oyuncu (veya bir başka düşman) yakın mesafedeyse ve yapay zeka bu orduya yenileceğini düşünüyorsa, toplayabileceği daha fazla ordusu yoksa, kaçmaktansa savunma yapabileceği bir mevkiye konuşlanıp orada 1 ay boyunca bekliyor. Bu şekilde savaş gereksiz uzamıyor, yapay zeka kazanamayacağı savaşta sürünmektense iyi bir mevkide savunma yaparak yeniliyor. Bu durum oyuncunun CK2’de olduğu kadar ordu kovalamayacağı anlamına geliyor. Bu sistem genellikle oyuncunun kaybetme ihtimalinin bulunmadığı savaşlarda devreye giriyor.

Aynı şekilde çoğu zaman oyun tasarımı esnasında yapay zekayı sürekli aklımızda tutmaya çalışıyoruz, daha önceleri sizlere kale mekaniklerinden bahsetmiştik fakat kısa bir özet geçmek gerekirse düşman topraklarının derinliklerine sınırdaki kaleleri almadan girmeniz ordunuzun asker kaybetmesiyle sonuçlanıyor. Yapay zeka neredeyse hiçbir zaman böyle bir harekete girişmiyor, dolayısıyla kendi kalelerinizin arkasında yer alıyorsanız yapay zeka ordusunun topraklarınıza ilerleyişine hazırlanmak için yeterli süreye sahip olacaksınız. Bu durum yapay zekayı topraklarının derinliklerine kadar kovalamak için daha az sebebinizin olmasına ve daha “kuşatma” odaklı savaşlar yaşanmasına sebep oluyor – bu da oyunun dönemini ele aldığımız vakit gayet gerçekçi bir sonuç.

Bu sistem daha önce bahsettiğim tüm hedeflerde fayda sağlıyor, önünde daha az seçenek olan yapay zeka daha doğru kararlar veriyor. Bu az sayıda seçenekten hangisini seçmesi gerektiğini daha iyi kodlayabiliyoruz. Oyuncunun canı daha az sıkılıyor. Oyunun tarihsel dokusuna uygun bir sonuç ortaya çıkarıp, haritanın yarısında kovalamaca yaşanmasının önüne geçiyor.

Bu zamana kadar askeriye yapay zekasından bahsettik, peki ya geri kalanı? Onlara yaklaşımımız CK2 ile oldukça benzer fakat elbette sıfırdan yapılmış vaziyetteler. Yapay zeka belli aralıklarla alabileceği kararları ölçüyor, bunun makul olup olmadığını değerlendiriyor. Bu noktada rastgelelik faktörü ve yapay zeka kişiliğinin etkileri söz konusu, böylelikle oyun her seferinde kendisini canlı hissettiriyor.

CK2’ye nazaran yapay zeka CK3’te çok daha modlanabilir vaziyette keza oyun içerisindeki etkileşimler çok daha az hardcoded unsur içeriyor. Halen hardcoded öğeler var fakat bunlar etkileşim değil, dolayısıyla yapay zekayı CK2’ye nazaran daha fazla etkileyebiliyorsunuz. Hardcoded unsurların azalması yapay zekayı dengelemenin daha kolay olmasını beraberinde getirdi. Çıkış sonrası oyunculardan aldığımız yorumlar doğrultusunda yapay zeka üzerinde yapacağımız değişiklikler bu sistem sayesinde çok daha kolay olacak. Karakterlerin eylemlerinin önemli bir kısmının CK2’den daha yüksek oranda eventler tarafından ele alındığını da not edelim.

Genel olarak askeriye harici yapay zekanın nihai amacının dünyayı canlı hissettirmek olduğunu söyleyebiliriz. Bu durumda kimi zaman oyuncuya çok yüklenilmemesi için çeşitli kısıtlamalar uyguladık, örneğin oyuncu karakteri hedef alan baştan çıkartma girişimlerinde bu tür bir kısıtlamamız var, böylelikle oyuncular başlangıç tarihindeki az sayıda kadın hükümdardan birini oynadığında neye uğradığını şaşırmıyor.

Birçok yönden yapay zeka CK2’ye benzer hissettirecek ancak oyuncuya daha iyi bir tecrübe sunmayı amaçlamaya odaklanacak. Çıkış sonrası CK2’ye nazaran yapay zekayı çok daha iyi geliştirebilir olacağız.

20200727_221955_1.jpg

Yeni Bilgisayar

İlginç bir şekilde bu günlüğü yazmamla günlüğün çıkışı arasında geçen sürede bilgisayarımı yenilemeye karar verdim. Yaşlanmış i7 4770K’mı Ryzen 9 3900X ile değiştirdim, 16 GB 2400 MHz RAM’in yerini 32 GM 3600 MHz RAM aldı. Sizler için yeniden 1 dakikalık Threading videosu çektim.

Gördüğünüz üzere oyun maksimum hızda oynanamayacak kadar hızlı. Bir dakikada 1498 gün geçti, bu da önceki bilgisayarımdan %56 daha hızlı olduğu anlamına geliyor, framerate de eskisine nazaran daha istikrarlı.

pasted_image_0_1.png

Bugünlük bu kadar, önümüzdeki hafta modlamadan bahsedeceğiz.

Yazar: Ali Alper Duman

Yayın Direktörü @ Strategyturk

Yorumla

STRATEGYTURK

Strategyturk'te strateji oyunlarından haberleri, yama notlarını, geliştirici günlüklerini ve daha birçok içeriği Türk strateji oyuncularına Türkçe bir biçimde sunuyoruz. Aynı zamanda yeni çıkan strateji oyunlarının ve eklentilerinin incelemelerini yapıyor, bu oyunlara dair sürekli olarak içerik oluşturuyoruz.

Sosyal medya sayfalarımızı takip ederek strateji oyunlarındaki gelişmelerden haberdar olabilirsiniz.

STRATEGYTURK TWITTER

Stellaris'te Necroidler ve Mishar Cabal #stellaris https://t.co/uVqr3b81RF
Hearts of Iron IV'te Türkiye Odak Ağacı #hoi4 https://t.co/UcONXW5zND

Strategyturk Arşiv