Vesperis2 (N2Play Altyapısı) - Geliştirme Günlüğü

  • Konuyu açan Konuyu açan Sys
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 56
  • Gösterim Gösterim 2K
Şimdi sıfırdan derlesem bile 2-3 dakika civarına düştü. -> Bu süre halen çok fazla game 30 db 10-12 saniye sürüyor bende full rebuild, build conflarında hata olabilir mi? MP açık mı derliyorsunuz yoksa statik derleme falan mı yapıyorsunuz?
 
Şimdi sıfırdan derlesem bile 2-3 dakika civarına düştü. -> Bu süre halen çok fazla game 30 db 10-12 saniye sürüyor bende full rebuild, build conflarında hata olabilir mi? MP açık mı derliyorsunuz yoksa statik derleme falan mı yapıyorsunuz?
Tam build aldığım dediğim Game DB, QC, client, client tools'larımın tamamını, yani A'dan Z'ye her şeyi build alıyorum. Granny2 SDK'yı bile build alıyorum diyebilirim size :D Bir sürü değişikliğim yeni araçlarım vs var. Modül bazında bazı build'leri, değişiklik çok büyük değilse, Bende 10 saniye civarında alıyorum. umarım sorunuza bir nebzede olsa yanıt olmuştur..
 
Güncelleme:
Genişlet Daralt Kopyala
1) Shader Tabanlı Sis (Fog) & Görüş Mesafesi
Eski DirectX FFP sis komutlarını çöpe atıp saf HLSL SM 3.0 lineer sis algoritmasına geçtim. Gerçek 3D kamera mesafesiyle hesaplandığı için dağlarda ve zindanlarda ufuk geçişleri çok daha yumuşak ve atmosferik oldu.

2) 2D Arayüz (UI) ve MiniMap Saf HLSL'e Taşındı
Slot pencereleri, harita ve bekleme süresi çemberlerindeki eski SetTextureStageState kalıntıları kaldırıldı. Tüm arayüz (Normal, Additive, Screen, Grayscale vb.) modern UI Shader ile çizilerek yüksek çözünürlüklerde (2K/4K) sıfır kayma ve tam netlik sağlandı.

3) Efekt Zemin Deformasyonu (Merdiven ve Eğim)
Bayırlarda veya basamaklarda havada asılı kalan/zemine batan yetenek çemberleri (Kükreme, Ateş Çemberi, Mühürler vb.) Artık zemin ve merdivenlerin arazinin eğimine tam oturuyor biraz daha yüksekliği artırırsam hoşuma gitmedi o yüzden az skiller gömülsün istedim.


Efekt Zemin Deformasyonu Fikri'ni @Reached 'in konusundan aldım kendisine teşekkür ediyorum.

 
Shadere taşırken yanlışlıkla D3D11 geçmişim yahu :aman:

(Müsait zamanda A dan z ye geçiş için neler yaptım güncelleme log geçmişi paylaşırım)



hcks9tnq.png
 
Projeye biraz ara vermek zorunda kaldım. 😔 Uzun bir süre güncelleme gelmeyecek gibi görünüyor ama belli de olmaz, belki bir anda geri dönerim. (Hanım ağayla biraz tartıştık da) Bu sebepten şimdilik projeyi rafa kaldırmak durumundayım, geri dönersem kaldığımız yerden devam ederiz.

1787429763335.webp


DX11 için backend tarafını bitirmiştim, diğer API desteklerini eklemeye fırsat olmadı. Kısmet değilmiş. Aslında güzel bir güncelleme sunacaktım.

Hatta derlenmiş shader'ların engine'de belirlenen register/slot düzenine uyup uymadığını kontrol eden yardımcı araçlara kadar eklemiştim. Shader compile olsa bile yanlış register kullanılmışsa bunu erkenden yakalayabilecek bir validation sistemi de vardı. imgui'de veya render.log da görebiliyorum.

belki döndüğümde sıfırdan bi Mainline'e bile giriş yapabilirim sağım solum yada kafamda ne esecek ben dahi bilmiyorum :D
tek bildiğim günlük bir kaç saat uğraşmam gerektiği üstü olursa sıkıntı yaşayacağımın garantisi :D (Dayak yemeye niyetim yok)
Sanırım biraz fazla geniş kapsamlı düşünmemek gerekiyormuş.
 
Uzun süredir güncelleme paylaşmıyordum, (Malum sebepler) arka planda üzerinde çalıştığım değişiklikleri kısaca özet geçmek istedim:

Render & Shader Mimarisi: DX-11 geçişini iptal ettim. Motorun mevcut render ve shader mimarisini çok daha stabil, hafif ve modern bir yapıya kavuşturmak için altyapıyı baştan ele aldım. Eski render kalıntılarını temizleyerek boru hatlarını yeniledim; shader tarafındaki çalışmaların yaklaşık %70'i tamamlandı.
Gölge Sistemi: Ağaç ve binalardaki CSM gölge yapısı istediğim performans ve akıcılıkta çalışmadığı için gölgeleri eski haline geri aldım. İlerleyen süreçte performansı etkilemeyecek alternatif bir çözüm düşünebilirim.
Offline Shop Dekorasyon: Çevrimdışı pazar sistemine pazar dekorasyon (görünüm) sistemi eklendi.

1-2 Saat de ne yapabiliyorsam onu yapıyorum (n)(n)


mlwj2raw.png
 
Uzun süredir güncelleme paylaşmıyordum, (Malum sebepler) arka planda üzerinde çalıştığım değişiklikleri kısaca özet geçmek istedim:

Render & Shader Mimarisi: DX-11 geçişini iptal ettim. Motorun mevcut render ve shader mimarisini çok daha stabil, hafif ve modern bir yapıya kavuşturmak için altyapıyı baştan ele aldım. Eski render kalıntılarını temizleyerek boru hatlarını yeniledim; shader tarafındaki çalışmaların yaklaşık %70'i tamamlandı.
Gölge Sistemi: Ağaç ve binalardaki CSM gölge yapısı istediğim performans ve akıcılıkta çalışmadığı için gölgeleri eski haline geri aldım. İlerleyen süreçte performansı etkilemeyecek alternatif bir çözüm düşünebilirim.
Offline Shop Dekorasyon: Çevrimdışı pazar sistemine pazar dekorasyon (görünüm) sistemi eklendi.

1-2 Saat de ne yapabiliyorsam onu yapıyorum (n)(n)


mlwj2raw.png
Ayamı gülümsedin reis ne bu güzellik.
:love:
 
Merhabalar uzun süre sonra güncelleme geldi :D

Güncelleme Detayları:
Genişlet Daralt Kopyala
 Sentinel Güvenlik Sistemi:

Sunucuya yapılan paket flood ve bot spam saldırılarına karşı hız sınırı getirildi.
Bağlanıp bekleyen hayalet bağlantılar 3 saniye içinde otomatik olarak oyundan atılıyor.
Hatalı paket veya bot şüphesinde otomatik ceza devrede: 60 saniye bekleme, 15 dakika karantina ve kalıcı ban.
Bir kanalda ceza alan saldırgan, tüm kanallardan ve giriş ekranından aynı anda düşürülüyor.
Tüm güvenlik hareketleri oyunda hiçbir kasma yapmadan arka planda veritabanına kaydediliyor.
GM'ler için anlık güvenlik durumunu görme ve oyuncuyu karantinaya alma komutları eklendi.


Yeni Yazı Tipi (Tipografi) Motoru:

Eski soluk ve tırtıklı font yerine modern mobil RPG'lerdeki gibi dolgun ve okunaklı Nunito Sans Bold yazı tipine geçildi.
Yazıların arkasına 8 yönlü kalın dış çerçeve (kontur) ve 2 piksellik 3D alt gölge eklendi; yazılar artık zemine veya zırha karışmıyor.
Küçük arayüz yazılarında harflerin iç boşlukları (e, a, o gibi) dolmasın diye özel ince çerçeve modu yapıldı.
Seviye ([Lv. 105]), karakter ismi, lonca ve patron yazılarına iki tonlu renk geçişi (gradyan) bağlandı. Seviye yazısı canlı zümrüt yeşili yapıldı.
Harf aralıkları dengelendi, DirectX kaynaklı yarım piksel kayma ve bulanıklık giderilerek yazılar cam gibi netleştirildi.
Yazı motorunun bellek kullanımı tamamen optimize edildi; kalabalık pazar ve savaşlarda yazılardan kaynaklı FPS düşüşü sıfırlandı.
Sohbette ve eşya açıklamasında tuş simgelerinin (Alt, Shift vb.) yanındaki yazıların simgenin üstüne binme hatası düzeltildi.
Bazı yabancı dillerde harflerin bozuk çıkması ve tanımlanamayan harflerde beliren boş kutucuk ([ ]) hatası giderildi.


oofzifgj.png

lqibnqdz.png


tq5ueve4.png
c38mlade.png
 
Merhabalar uzun süre sonra güncelleme geldi :D

Güncelleme Detayları:
Genişlet Daralt Kopyala
 Sentinel Güvenlik Sistemi:

Sunucuya yapılan paket flood ve bot spam saldırılarına karşı hız sınırı getirildi.
Bağlanıp bekleyen hayalet bağlantılar 3 saniye içinde otomatik olarak oyundan atılıyor.
Hatalı paket veya bot şüphesinde otomatik ceza devrede: 60 saniye bekleme, 15 dakika karantina ve kalıcı ban.
Bir kanalda ceza alan saldırgan, tüm kanallardan ve giriş ekranından aynı anda düşürülüyor.
Tüm güvenlik hareketleri oyunda hiçbir kasma yapmadan arka planda veritabanına kaydediliyor.
GM'ler için anlık güvenlik durumunu görme ve oyuncuyu karantinaya alma komutları eklendi.


Yeni Yazı Tipi (Tipografi) Motoru:

Eski soluk ve tırtıklı font yerine modern mobil RPG'lerdeki gibi dolgun ve okunaklı Nunito Sans Bold yazı tipine geçildi.
Yazıların arkasına 8 yönlü kalın dış çerçeve (kontur) ve 2 piksellik 3D alt gölge eklendi; yazılar artık zemine veya zırha karışmıyor.
Küçük arayüz yazılarında harflerin iç boşlukları (e, a, o gibi) dolmasın diye özel ince çerçeve modu yapıldı.
Seviye ([Lv. 105]), karakter ismi, lonca ve patron yazılarına iki tonlu renk geçişi (gradyan) bağlandı. Seviye yazısı canlı zümrüt yeşili yapıldı.
Harf aralıkları dengelendi, DirectX kaynaklı yarım piksel kayma ve bulanıklık giderilerek yazılar cam gibi netleştirildi.
Yazı motorunun bellek kullanımı tamamen optimize edildi; kalabalık pazar ve savaşlarda yazılardan kaynaklı FPS düşüşü sıfırlandı.
Sohbette ve eşya açıklamasında tuş simgelerinin (Alt, Shift vb.) yanındaki yazıların simgenin üstüne binme hatası düzeltildi.
Bazı yabancı dillerde harflerin bozuk çıkması ve tanımlanamayan harflerde beliren boş kutucuk ([ ]) hatası giderildi.


oofzifgj.png

lqibnqdz.png


tq5ueve4.png
c38mlade.png
Efsane olmuş adaş ilk kez Metin2'nin yazılarını değiştirip de oyunu 1 haftada uniity'de yapılmış dandik metin2 kopyalarına benzetmeyen bir vaka görüyorum tebrikler. Süper görünüyor yazılar
 
Uzun zamandır üzerinde çalıştığım ve istemcinin bel kemiğini oluşturan grafik motoru modernizasyonunu tamamladım. Bu yazıda yüzeysel geçmek yerine arkada dönen mimariyi, karşılaştığım teknik darboğazları ve çözümleri detaylıca anlatmak istedim.

1. Eski Miras Mimari ve Karşılaşılan Sorunlar
Metin2'nin orijinal istemcisi bildiğiniz gibi DirectX 8-9 FFP (Fixed Function Pipeline) mimarisine göbekten bağlıydı. Kod tabanında CStateManager, küresel LPDIRECT3DDEVICE9 işaretçileri ve D3DFVF bayrakları motorun neredeyse her yerine (GameLib, EterLib, UserInterface, EffectLib) kılcal damar gibi yayılmıştı. Bu durum üç büyük soruna yol açıyordu

- Modern işletim sistemlerinde ve yeni nesil ekran kartlarında (özellikle Intel Arc ve yeni AMD/Nvidia sürücülerinde) DX9 emülasyon katmanının getirdiği FPS dalgalanmaları ve mikro takılmalar (stuttering).
- Sabit fonksiyonlu render durumlarının (FFP) modern GPU gölgelendiricileriyle (programmable shaders) esnek çalışamaması.
- Kodun tek bir grafik API'sine kilitli kalması yüzünden farklı arka uçlara (DX11, Vulkan vb.) geçişin imkansız hale gelmesi.

2. Neler Yaptım? (Mimari ve Teknik Detaylar)

A) Özel RHI (Render Hardware Interface) Katmanı
İlk iş olarak motoru doğrudan DirectX çağrıları yapmaktan kurtardım. Donanım ve grafik kütüphanesi arasında soyut bir katman (IRHIDevice, IRHITexture, IRHIBuffer, IRHIShader, RHIFactory) kurdum. Bütün render boru hattını C++23 standartlarında, RAII disipliniyle ve sıfır-tahsis (zero-allocation) döngüsüyle yeniden yapılandırdım. Artık oyun motoru arkada hangi API'nin çalıştığını bilmiyor; yalnızca RHI arayüzüyle konuşuyor.

B) DirectX 11 (HLSL Shader Model 5.0) Boru Hattı
DirectX 11 backend'ini sıfırdan inşa ettim:
- DXGI SwapChain yönetimi, modern render target yapıları ve dinamik vertex/index buffer havuzları kuruldu.
- Karakterler, harita zeminleri (terrain), su efektleri, ağaçlar (SpeedTree) ve parçacık sistemleri (effects) HLSL SM 5.0 gölgelendiricilerine uyarlandı.
- Aynı zamanda eski sistemlerle tam uyumluluğu korumak adına klasik DirectX 9 boru hattını da HLSL SM 3.0 seviyesinde RHI'a bağladım. İki API arasında sıfır regresyon ve tam görsel sadakat sağlandı.

C) Oyun İçi Dinamik API Geçişi ve Çoklu Dil Desteği
Kullanıcının karmaşık ayarlarla uğraşmadan grafik motorunu değiştirebilmesi için Sistem Seçenekleri menüsüne doğrudan motor seçim arayüzü entegre ettim. Ayar metin2.cfg içine kaydediliyor ve 8 farklı dilde (tr, en, de, hu, it, pl, pt, ro) standart olarak yerelleştirildi.

D) Draw Call Optimizasyonu ve Sınırsız 500+ FPS
DirectX 11'i ilk ayağa kaldırdığımda kare hızının monitörün tazeleme hızına kilitlendiğini ve CPU tarafında gereksiz bir sürücü yükü oluştuğunu tespit ettim. Bunu çözmek için şu müdahaleleri yaptım:
- SwapChain Present Desync: DXGI başlatma sırasındaki sabit VSync bayrağını kaldırıp istemci ayarlarına dinamik olarak bağladım. VSync kapalıyken Present(0, 0) çalıştırılarak DX11 tarafındaki FPS kilidi tamamen kırıldı.
- Input Layout Önbellekleme: DX11'de her draw call çağrısında FNV-1a ile bytecode hash'i üretilip unordered_map üzerinden layout aranıyordu. Bunu dirty check ve m_pBoundInputLayout kontrolüne alarak kare başına binlerce kez çalışan anlamsız hash hesaplamalarını sıfıra indirdim.
- Constant Buffer ve Doku Slot Önbelleklemesi: Her çizimde yinelenen VSSetConstantBuffers/PSSetConstantBuffers COM çağrılarını temizledim. SetTexture fonksiyonuna 8 slotluk doku durum kontrolü ekleyerek aynı dokunun alt alta defalarca GPU'ya bağlanmasını (bind overhead) engelledim.
- Debug Layer İzolasyonu: Release derlemelerinde aktif kalan D3D11_CREATE_DEVICE_DEBUG bayrağını kapatarak Microsoft Debug Layer'ın binlerce draw call üzerinde yarattığı CPU doğrulama gecikmesini yok ettim.
Sonuç olarak 360Hz monitörümde DirectX 11 modunda VSync kapalıyken 500+ FPS değerlerini yakaladım

E) Geliştirici ve Teşhis Araçları
Geliştirme aşamasında render analizlerini profesyonelce yapabilmek için:
- RenderDoc Entegrasyonu: F12 tuşuna basıldığında çalışan kareyi doğrudan GPU seviyesinde yakalayan kancayı (API hook) D3D11 moduna entegre ettim.
- Dear ImGui Paneli: Oyun içi kamera, buffer, shader sabitleri ve anlık kare istatistiklerini izleyebileceğim geliştirici arayüzünü motora gömdüm.

3. Sırada Ne Var?
RHI soyutlaması sayesinde motor artık tamamen platform ve API bağımsız hale geldi. Bir sonraki durağım; oyunu yerel olarak Linux, Steam Deck ve Android mobil platformlarına taşıyabilmek adına saf bir Vulkan backend'i yazmak olacak. Ama biraz windowstan koparmak istiyorum bağımlılıklarım oldukça az o yüzden hızlı olur ne zaman yaparım bilmiyorum..


huiltdyh.png



wzc8kdkb.png


1do2rqbu.png


8ilxkzwz.png
 
dx11 cart curt muhabbetlerine hiç atılmadım ama changelog güzel başarılar biladerim
 
DirectX 9 ve DirectX 11 çift backend mimarisine geçtim. Daha önceki geçişi iptal etmiştim bir takım sorunlar sebebiyle şimdi renderdoc'dahil taratmadığım kontrol etmediğim bir şey kalmadı dx9 da nasıl çalışıyorsa 11 de öyle çalışıyor.

(Performans Artışı vs şuanlık beklemiyorum ama ufak farklar elbette var video'da anlaşılıyor )

Yüksek yenileme hızlı monitörler ve sınırsız FPS için render kısmını rework ettim.

RHI inşa ederken hiç acele etmemiştim ama bu kadar da uzun sürmesini bu kadar teknik problem çıkarmasını beklemiyordum

BGFX kullanmak istememiştim keşke kullansaydım dediğim çok anı oldu :alsaa:


Eski 16 imleçli hantal fare yapısını kaldırdım. Doğrudan donanım seviyesinde çalışan cross-platform Hardware Cursor sistemine geçtim, 1000Hz-8000Hz farelerde gecikme sıfırlandı. kontrol ederken biraz zorlanıyorum :D

Dinamik ve statik gölge tekrar aktif edildi (Artık CSM Değil ileride ne yaparım bilmiyorum)

Giriş ekranı yenilendi. SV-1/SV-2 sunucu butonları, F1-F7 kısayollu 7 hesap slotu ve tek tıkla dili değiştiren otomatik restartlı dil seçimi eklendi.
Arayüzdeki göz yoran eski animasyonlu alev efektleri ve atıl görseller temizlendi, kısmen sade temaya geçildi. tasarım konusunda rezaletim

bkz:
nahdfsfw.png



O yüzden forumdan bir adet beğendiğim files'i indirip görselleri dızladım :D

2ktct95c.png



Buda dümenden video:
 
Geri
Üst