DirectX 11 Migrasyon ve Multi-Threaded Mimari

  • Konuyu açan Konuyu açan victory
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 598

victory

Üye
Üye
Mesaj
50
Çözümler
2
Beğeni
15
Puan
689
Ticaret Puanı
0
Merhaba arkadaşlar,

Yıllardır 32-bit clientlerde 61 FPS max cap ile, kalabalık alanlarda 10-30 frame oyun oynamaya, PvP yapmaya zorunlu bırakıldık. Özellikle yapay zekanın gelişmesiyle artık Metin2 clientlerinin kalabalık alanlarda dahil 200+ FPS alabilecek hale sokulmasının pek de zor olmayacağını düşünüyorum.

Özellikle Render, Network ve Game Logic'in ağır CPU-bound işlemlerinin sadece main thread'de yapılıyor olması 2000'li yılların mimarisi. Artık GPU, ağır render işlemlerinde CPU'dan bayrağı alarak mimari düzeni kökünden değişti. 2000'lerde varlığıyla yokluğu bir olan GPU'lar artık oyun piyasasının bel kemiği haline gelmiş durumda. Ancak Metin2 clientleri bu treni kaçırdı.

Neden DX9 Değil, DX11?​

Toplulukta DX9 upgrade'leri yapılıyor biliyorum, ama DX9 temelde DX8'in biraz daha düzenli hali — hâlâ single-threaded, hâlâ per-draw-call CPU overhead'i yüksek, hâlâ GPU skinning ve instancing desteği sınırlı. DX11 ise oyunun kaderini değiştirecek üç şeyi getiriyor: GPU Skinning (CPU'daki frame başına 100,000+ vertex transform işlemini GPU'ya taşıyarak ~7ms/frame kazanım), Instanced Rendering (aynı zırhı giyen 20 savaşçıyı 20 draw call yerine tek draw call'da çizerek ~85ms/frame kazanım) ve Multi-threaded Rendering (Deferred Context ile render komutlarını birden fazla CPU core'a dağıtma). DX9 ile bunların hiçbirini düzgün yapamazsınız.

Ne Yapılması Gerekiyor?​

Kısaca: DX8 Fixed-Function Pipeline'dan DX11 + HLSL shader mimarisine geçiş, GrannyDeformVertices() CPU skinning'inden GPU bone transform'a geçiş, tek thread'deki game loop'un (network, game logic, render) ayrı thread'lere dağıtılması ve instanced draw call sistemi. Mevcut asset'ler (.gr2, .dds) aynen kalır — sadece codebase güncellenir.

Ben bu konuda codebase'i baştan sona analiz ettim (EterLib, EterGrnLib, GameLib, EffectLib, SpeedTreeLib, tüm rendering pipeline ve thread yapısı) ve uygulanabilir bir yol haritası çıkardım.

Bazı sorularım var:​

  • Bunu daha önce yapan veya deneyen var mı? Deneyimlerinizi paylaşırsanız çok değerli olur.
  • Ücretli olarak projeye dahil olabilecek, projeyi üstlenebilecek C++ / Graphics Programmer var mı? DirectX 11, HLSL, multi-threaded engine ve tercihen Granny 2 SDK deneyimi olan birini arıyorum.
  • Ekip arkadaşı olmak isteyen var mı? C++ rendering pipeline, DX11 veya multi-threaded architecture konularında deneyiminiz varsa birlikte çalışabiliriz.
İlgilenenler özelden ya da konu altından ulaşabilirler.
 
Özellikle yapay zekanın gelişmesiyle artık Metin2 clientlerinin kalabalık alanlarda dahil 200+ FPS alabilecek hale sokulmasının pek de zor olmayacağını düşünüyorum.
Bunun kesinlikle kolay bir iş olmayacağını söyleyeyim en başta. Kalabalık alanlarda 200+ FPS almak inanılmaz bir optimize isteyen bir durum. Hatta neredeyse imkansız çünkü Metin2'nin direkt olarak bütün baştan aşağıya belkide client yapısını değiştirmeniz gerekebilir. Her harekette kabalık alanlarda mutlaka FPS'iniz düşer. Bu görüş alanlarıylada ilgili. Clientim 155 FPS ve 64 bit. Ona rağmen 50 Metinde FPS düşüşleri yaşanabiliyor ancak tabi ki yapılan optimizasyonun iyi olduğunu varsayarak bu düşüş 155'ten 130-120 aralarına geliyor 200+ kişide bu veya 200 Metinde bunu yapabilmek için inanılmaz bir görüş açısının kısılmasına ihtiyaç olduğunu düşünüyorum. Modern oyunlar bile tanıtımlarını 90-120 FPS'te yapıyor genel olarak.

İkinci konu neden DX9 kullanılıyor neden DX11 kullanılmıyor?
Tabi ki DX11 çok daha gelişmiş ve çok daha performanslı çalışacaktır ancak burada durum aslında yetersiz bilgi olması. Şu anda baksanız 1 yada 2 tane Metin2 Sunucusu DX11 kullanıyordur. Aktif olarak yapan kişilere bile illallah ettirir bu durum. Yapan kişileride bizzat tanıyorum. Gerçekten inanılmaz zor bir şey bu söyledikleriniz ve bunu yaptıktan sonra birde üzerine optimizasyon yapıp FPS'i stabil olarak koruyabilmeniz gerekiyor. Evet araştırırken yapay zekaya sorduğunuzda kolay gibi gözüküyor ama gölgeleri bile baştan sona ayarlamanız gerekecek bu durumda.

Multi thread konusunda gelecek olursak bencede Multi thread bir yapı olsaydı bencede daha performanslı olurdu. Ancak bu çok ama çok ciddi değişiklik ve test gerektiren birşey bu dedikleriniz minimum 3-6 aylık bir yapım ve test süreci gerektirir. Ki bu daha önce test edilmediğinden canlı sunucuda ne gibi sorunlarla karşılaşacağınızı bilemeyeceksiniz. Tonla sorun yaşayacaksınız. Bu sebeple yapay zekaya güvenip bunu kesinlikle ama kesinlikle yapmaıyn. Hem zaman hem para kaybı tamamen.

Örneğin basit örnek Metin2 hala neden python 2.7 kullanıyor? Çünkü geçirmesi hem inanılmaz zahmetli hemde baştan aşağıya tüm client'i elden geçirmek demek. Yani kısaca bu kolay birşey değil.

Örnek olarak DX11 sisteminden bir örnek görsel:
1771632362537.webp


Bu sistem bu aşamalara gelirken ne yollar kat etti anlatamam muhtemelen o kadar çok değişiklikten bahsediyorum ama yinede hırslıysanız tabi hiç bir şey imkansız değildir.
 
DX8 veya DX9'dan doğrudan DX11'e geçiş ve bunu metin2 gibi tamamen modern motor desteğinden uzak - statik bir dosya yapısına sahip bir projede gerçekleştirmek sadece C++ değil, ileri düzeyde DirectX programlama bilgisi de gerektirir. Söz konusu geliştirici C++ uzmanı bile olsa eğer grafik programlama bilgisi yoksa doğal olarak bunu yapamayacaktır. Şahsen ben aylardır grafik kısmına yoğunlaşmış bulunuyorum ancak ben işin derin kısımlarını kurcalıyorum daha çok. Şu an proje DX9 kullanıyor fakat proje içerisinde metin2'nin kod tarafında varsayılanda kullandığı dx9 nesnelerinin neredeyse hiç biri yok.
Materyal sistemi, aydınlatma sistemi, gölgeler, ortak kullanılan matematiksel hesaplamalar, d3dx math işlemleri vs. bunların bazıları ya artık tamamen yoklar, ya da revize edildiler. FFP kodların ise kalıntısı bile kalmadı.

Benim için en önemli kısım ise gpu skinninge geçiş oldu. Bu süreçteki en büyük engeldi benim için. Sonrasında ise yaptığım ilk şey optimizasyonu daha da ileri taşımak oldu. Şuan itibari ile 100 metinde 61 fps sabit alıyorum ve bu haliyle bıraktım. Asıl amacım tüm altyapıyı directx11'e hazırlamak ve sonrasında bir deneme bile olsa directx11'e güncellemek. Şu an altyapıda directx11 motoru da aktif olarak yer alıyor ancak hiçbir şekilde kullanılmıyor tabi, sadece client açılınca aktifleşiyor ve öylece duruyor hepsi o. İlerleyen zamanlarda yavaş yavaş mevcut motoru oraya kaydıracağım.

Eğer yanılmıyorsam bugüne kadar bunu tam anlamıyla yapabilen bir proje yok, çünkü başta dediğim gibi ileri düzeyde bilgi gerektirmesinin yanında, tek bir kişinin 1-2 ayda yapabileceği bir şey değil. Piyasada görülen directx11 projeler genellikle API/Bridge desteği ile bunu gerçekleştiriyor. Bunun en büyük getirisi iş yükünü ciddi oranda azaltması, büyük oranda kod sadeleştirmesi ve zamandan tasarruf.
Bu da bir alternatif tabi, fakat benim tercih edeceğim bir şey değil açıkçası. Yapabileceğimden emin değilim ama niyetimde herhangi bir harici api vb. kullanmadan sadece client altyapısını tepeden tırnağa güncelleyip directx11 tabanlı hale getirmek.

C++ kısmına gelecek olursak; optimizasyonun kalbi c++ tarafında atıyor desem yanılmam sanırım. Her ne kadar tamamen shader tabanlı çalışsam da c++ tarafında yapılan hatalar veya mevcut eski kodlar darboğaz yapmaya çok müsait. Metin2 baştan sona immediate render yapısına sahip olduğundan cpu'ya bindirilen yük kaçınılmazdır. DX8/9 kullanıldığı sürece de kaçınılmaz olacaktır. Tabi bu o dönemlerde kullanılmaya müsait bir yapıydı ama günümüzde güncellenip terk edilmesi gereken bir yapıdır. Şu an yapmaya çalıştığım şey ise tam olarak bu. Eğer bunu başarabilirsem(ki zor görünüyor) sonrasında multi-thread vb. işlerine girişeceğim.

Son olarak, bunları yapabilecek birini bulursanız çok ciddi fiyatlarla karşılaşabileceğinizi hatırlatmak isterim. Bu tarz büyük çaplı geliştirmeler için sanırım en doğru adres Metin2'den bağımsız olan yabancı yazılım firmalarıdır diye düşünüyorum.
 
Dx11 belasını bu adelet sardı her yere bir anda herkes bende dahil heveslendim ama bu heves anamızı ağlattı desem yeridir, ek olarak CPU gpu skinning de biz çok fark göremedik uğraşmaya değmezdi o yüzden optimizasyonu kalbi bencede tamamen c++ tarafında atıyor özellikle charactermanagerle vs....


sabit 120 ye kadar çıkabildik 120 aşağısını görmedi hiç değermiydi sorusu ise kişisel fikrim değmezdi bu aşamaya gelene kadar commitler küfürlüydü :ROFLMAO:


1774225476069.webp


dx1134.webp




1774225205303.webp
 
Geri
Üst