Nidavelir Filesı ile Grafiksel Çıldırmacalar

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 20
  • Gösterim Gösterim 815

Tengrist

Mapper
Mapper
Yardımsever Üye
MT Üye
Mesaj
1.838
Çözümler
44
Beğeni
1.873
Puan
1.329
Ticaret Puanı
0
-God Rays dediğimiz mevzuyu ekledim bir miktar sudaki yansıma muhabbetini daha realistic hale çektim, mantığını kurabilirsem devamında karakter ya da binek vs koştuğunda suda kendi dalgalanması ve suların etrafa damla damla saçılması muhabbeti var. günlerdir youtubeda boş zamanlarımda grafik programlamanın mantığını anlamaya çalışıyorum çok şükür matematik seviyem yetiyor anlamaya. god rays'den sonra jettyxin çim muhabbetini ekledim bu alagavas specularla çimeni bağlamış, specularlı haritalarda dungeon maplerinde falan gidince çimen çıkıyo saçma sapan bir şeyler var :D çimen olayını da 2ye böleceğim yapabilirsem videosunu çekerim bu gece. şimdilik boş durmasın diye god raysi bırakıyorum.
ayrıca harita da rezillik tasarımla uğraşamadım var olanlar üstünde geliştireceğim şimdilik.

nida1.webp
 
nida2.webp


Adsız.webp


üç bir'in dışında da fps baya problem :D
gördüğüm 2 büyük problemden biri diğeri de ağaçlarda flicker var zamanla artık hallederiz :d

şu an için grass mantığını istediğim zemin dds'inin üzerine 0 ila 100 yoğunluğu arasında çıksın diye ayarladım şu an çiçekler yüzde 15 gibi yoğunlukta iken klasik çimler yüzde 100 yoğunlukta, estetiğe dikkat etmeksizin bulduğum bitkileri koyup geçtim. şu an bitkiler dds'ten görüntü çekip x ve y ekseninde 1 tur çizilerek oturtturuluyor maplere bu mantığa da birkaç fikrim var daha natural duruş için yapabilirsem o resimleri de çekeceğim.
 
Ey maşallah mübarek adam,
Eline sağlık vareze ne zaman düşer :D​
 
filesın sorunlar neler grafiksel anlamda hacım onları da çözeyim atarım clienti wareze
Onca uğraşıp sonra onu ücretsiz paylaşmak ve ilgi görmek bence ücretli satmaktan daha hoş oluyo,
Ciddi değildim ama şu ambiyans için beklemeye değer eline sağlık tekrar güncellemeleri bekliyor olacağım. :)​
 
cimsiz.webp

cimli.webp

Bizim grass sisteminde SPT materyallerini direkt ağaç mantığında kullanmıyoruz artık Mantık şu: zeminde hangi ground texture varsa onu okuyup, o texture için tanımladığımız SPT modelini otomatik olarak o bölgelere yayıyoruz. Yani ben haritaya tek tek çim çizmek zorunda kalmıyorum.

Mesela ground tarafında grass.dds kullanılıyorsa TXT içinde diyorum ki bu zeminin üstünde şu SPT modeli çıksın. Sonra DENSITY, SPACING, COVERAGE gibi değerlerle ne kadar sık olacağını ayarlıyoruz. %100 dediğimiz zaman hedefimiz o ground texture'ın görüldüğü yerin mümkün olduğunca tamamen çimle kaplanması. Bir de aynı ground'un altına birden fazla SPT koyabiliyoruz; böylece tek tip çim yerine uzun çim, kısa çim, farklı otlar falan karışık çıkabiliyor.

SPT'nin güzel tarafı da şu: normal PNG/DDS billboard çim gibi dümdüz iki tane çapraz plane koymak yerine, modelin kendi branch/leaf/frond parçalarını kullanabiliyoruz. O yüzden çime biraz hacim geliyor. Kendi texture'ını da SPT'den alıyor. İstersek sadece leaf kısmını, istersek branch + leaf gibi parçaları kullandırabiliyoruz.

Yüksekliği de HEIGHT_OFFSET ile ayarlıyoruz. Mesela model toprağın üstünde kalıyorsa -10, -12 gibi aşağı gömüyoruz. MODEL_SCALE ile boyunu ayarlıyoruz. COLOR_MATCH ile zeminin rengine biraz yaklaştırıyoruz ki yemyeşil çim kahverengi zeminin üstünde yapıştırılmış gibi durmasın. WIND de çok hafif veriyoruz; çünkü fazla verdiğimizde çim değil ağaç gibi sağa sola sallanıyor.

örnek grass.txt:
Genişlet Daralt Kopyala
# V19: COVERAGE=FULL asla zemine opak kare cizmez; 100 = tum uygun yerlesim noktalarinda bitki.
# SPACING = yakin bolge araligi; orta bolge en az 65 birim, uzak 125 birimdir.
# Tamamen saydam DDS yapraklari arasindan zemin fiziksel olarak gorunebilir.
# V18: FULL -> 100% eligible coarse cells + dense close grass and material-aligned opaque carpet.
# SPACING: 25..250 game units, 35 = dense grass, 125 = original spacing.
# Dense clumps within 1900 units; carpet within 4050 units; beyond that normal V17 LOD.
# FULL carpet uses opaque grass-tinted ground based on supplied DDS; does not create 3D blades for every pixel.
# VIELLO GRASS V19 - dogal, opak kare kaplayici OLMADAN sik bitki ortusu
# Oyun yolu: d:/ymir work/environment/viello_grass_rules.txt
# DENSITY 100: Uygun yerlesim hucresinin tamaminda bir ornek; her DDS pikselinde degil.
# GEOMETRY: GRASS_CLUMP = egimli cim kumesi; FLOWER_CARDS = dik cicek kartlari.
# BLADES: V17 2..8; 9 desteklenmedigi icin 8 kullanildi.
# SCALE_MIN/MAX: V17 0.35..2.5. Kucuk eski olcekler WIDTH/HEIGHT ile korunuyor.
# WIDTH_SCALE/HEIGHT_SCALE: V17 0.35..2.5; bitki en ve boyunu ayri ayarlar.
# COLOR_MATCH: 0..100; WIND: 0..1, 0.5 = en dusuk sifir-disi ruzgarin yarisi.
# Tum yollar kullanicinin orijinal TXT dosyasindan alinmistir.

[GROUND]
TERRAIN = "d:/ymir work/terrainmaps/betefilase.jimdo.com/grass01.dds"

GRASS = "sound/grass/viellogenel.dds"
DENSITY = 100
SPACING = 35
COVERAGE = FULL
GEOMETRY = GRASS_CLUMP
BLADES = 8
WIDTH_SCALE = 1.60
HEIGHT_SCALE = 0.50
SCALE_MIN = 0.60
SCALE_MAX = 0.90
WIND = 0.5

SPT = "d:/ymir work/environment/viello_vegetation/flower.spt"
RENDER_PARTS = ALL
DENSITY = 15
SPACING = 220
COVERAGE = NORMAL
MODEL_SCALE = 0.65
HEIGHT_OFFSET = +6
COLOR_MATCH = 15
WIND = 0.5

SPT = "d:/ymir work/environment/viello_vegetation/plant_bush.spt"
RENDER_PARTS = ALL
DENSITY = 15
SPACING = 220
COVERAGE = NORMAL
MODEL_SCALE = 0.65
HEIGHT_OFFSET = -16
COLOR_MATCH = 15
WIND = 0.5

# V21 SPT leaf, bark/trunk/branches and fronds: DDS discovered inside .spt; no manual texture paths.
# LEAVES_BRANCHES includes SpeedTree woody branch mesh, which may contain trunk.
# ALL additionally includes native fronds if present in the SPT.
# Multiple SPT declarations under the SAME GROUND create independent species.
SPT = "d:/ymir work/environment/viello_vegetation/redpine1.spt"
RENDER_PARTS = ALL
DENSITY = 25
SPACING = 250
COVERAGE = NORMAL
MODEL_SCALE = 3.70
HEIGHT_OFFSET = -12
COLOR_MATCH = 25
WIND = 0.5
[/GROUND]

[GROUND]
TERRAIN = "d:/ymir work/terrainmaps/betefilase.jimdo.com/grass02.dds"

GRASS = "sound/grass/viellogenel.dds"
DENSITY = 100
SPACING = 35
COVERAGE = FULL
GEOMETRY = GRASS_CLUMP
BLADES = 8
WIDTH_SCALE = 1.60
HEIGHT_SCALE = 0.50
SCALE_MIN = 0.65
SCALE_MAX = 0.90
WIND = 0.5


SPT = "d:/ymir work/environment/viello_vegetation/ot/treeeasthemlockfa.spt"
RENDER_PARTS = ALL
DENSITY = 15
SPACING = 120
COVERAGE = NORMAL
MODEL_SCALE = 3.85
HEIGHT_OFFSET = +6
COLOR_MATCH = 15
WIND = 0.5
[/GROUND]

[GROUND]
TERRAIN = "d:/ymir work/terrainmaps/betefilase.jimdo.com/grass03.dds"

GRASS = "sound/grass/viellogenel.dds"
DENSITY = 100
SPACING = 35
COVERAGE = FULL
GEOMETRY = GRASS_CLUMP
BLADES = 8
WIDTH_SCALE = 1.60
HEIGHT_SCALE = 0.50
SCALE_MIN = 0.65
SCALE_MAX = 0.90
WIND = 0.5

SPT = "d:/ymir work/environment/viello_vegetation/flower2.spt"
RENDER_PARTS = ALL
DENSITY = 15
SPACING = 120
COVERAGE = NORMAL
MODEL_SCALE = 1.55
HEIGHT_OFFSET = +6
COLOR_MATCH = 15
WIND = 0.5
[/GROUND]
 

Adsız.webp

Tam olmuş varya Ağacın arkasından ok fırlatıyor falan.. :D​
 

32758 eklentisini görüntüle
Tam olmuş varya Ağacın arkasından ok fırlatıyor falan.. :D​
bunlar daha bebek adımları hacım yapmak istediğim şey unrealda mıydı bi programda gördüm texture terrain dosyalarını veriyor ona uygun doğal biyom yaratıyor. ben daha kısmen spt okuma işini bitirdim ama ağaçların dalları ve yaprakları propertyden çektiği gibi çekmiyor o olayı da halledebilirsem verdiğimiz dds'e uygun ağaç,bitki,çim modellerini çıkartaabileceğiz ve uygun bir çim spt'si bulamadım yerdeki çimler jettyxinki gibi ddsden çekip kendi yaratıyor x-y düzlemine uygun olarak. düzgün bir grass bulabilirsem yerdeki her şey spt tabanlı olacak. normal ağaç gibi de kastırtmıyor zemine koyduğum dds'ten oluşan çim kapanınca sptden sadece verirsem fps pek azalmıyor şimdiki gibi.
 
bunlar daha bebek adımları hacım yapmak istediğim şey unrealda mıydı bi programda gördüm texture terrain dosyalarını veriyor ona uygun doğal biyom yaratıyor. ben daha kısmen spt okuma işini bitirdim ama ağaçların dalları ve yaprakları propertyden çektiği gibi çekmiyor o olayı da halledebilirsem verdiğimiz dds'e uygun ağaç,bitki,çim modellerini çıkartaabileceğiz ve uygun bir çim spt'si bulamadım yerdeki çimler jettyxinki gibi ddsden çekip kendi yaratıyor x-y düzlemine uygun olarak. düzgün bir grass bulabilirsem yerdeki her şey spt tabanlı olacak. normal ağaç gibi de kastırtmıyor zemine koyduğum dds'ten oluşan çim kapanınca sptden sadece verirsem fps pek azalmıyor şimdiki gibi.
Eline emeğine sağlık güncellemeleri merakla bekliyorum vallahi. :)​
 


Files'ın kronik flicker sorununu çözdüm. göz kırpar gibi bir yaprakların üzerine gölge vururmuş gibi bir ışık vururmuş gibi göz kırpmasal saçmalığı düzelttim. Aşağıya da şimdiye kadar yaptığım değiştirdiğim özellikler ve defineleri bulunuyor jtx yazanlarda da major değişiklikler var.

Eklentiler:
Genişlet Daralt Kopyala
// ============================================================
// DIRECTX
// ============================================================

#define DirectX9Ex
#define DIRECTX9


// ============================================================
// FPS / FRAME SYSTEM
// ============================================================

#define ENABLE_FPS_SYSTEM_LIMIT_REWORK

#ifdef ENABLE_FPS_SYSTEM_LIMIT_REWORK
#define FPS_SYSTEM_FORCE_60FPS
#endif


// ============================================================
// SPEEDTREE / TREE SYSTEM
// ============================================================

#define JTX_GPU_LEAF_PLACEMENT
#define JTX_GPU_TREE_WIND
#define JTX_TREE_DYNAMIC_LIGHT

#define FIX_MEMORY_SPEEDTREE


// ============================================================
// POST PROCESS / CAMERA / WATER REFLECTION
// ============================================================

#define JTX_UNDERWATER_CAMERA
#define JTX_WATER_REFLECTION
#define JTX_DEATHCAM
#define JTX_SHARPNESS


// ============================================================
// VIELLO ADVANCED WATER
// Client/GameLib/VielloWaterFeatures.h
// ============================================================

#define ENABLE_VIELLO_ADVANCED_WATER

#ifdef ENABLE_VIELLO_ADVANCED_WATER

#define ENABLE_VIELLO_WATER_FRESNEL
#define ENABLE_VIELLO_WATER_DEPTH
#define ENABLE_VIELLO_WATER_GERSTNER_WAVES
#define ENABLE_VIELLO_WATER_SHORE_FOAM
#define ENABLE_VIELLO_WATER_CHARACTER_RIPPLES
#define ENABLE_VIELLO_WATER_SPLASH

#define ENABLE_VIELLO_WATER_DIAGNOSTICS

#endif


// ============================================================
// VIELLO GRASS / VEGETATION
// Client/GameLib/VielloGrassFeatures.h
// ============================================================

#define ENABLE_VIELLO_TEXTURE_GRASS

#define VIELLO_GRASS_RULES_FILE \
    "d:/ymir work/environment/viello_grass_rules.txt"

#define VIELLO_GRASS_GRID_UNITS          125.0f
#define VIELLO_GRASS_MAX_INSTANCES      55000
#define VIELLO_GRASS_MAX_BATCH          1000
#define VIELLO_GRASS_SECTORS_PER_FRAME  12

#define VIELLO_GRASS_LOD_NEAR           1600.0f
#define VIELLO_GRASS_LOD_MIDDLE         4000.0f
#define VIELLO_GRASS_LOD_FAR            7600.0f


// ============================================================
// VIELLO ATMOSPHERE
// Client/GameLib/VielloAtmosphereFeatures.h
// ============================================================

#define ENABLE_VIELLO_GOD_RAYS
#define ENABLE_VIELLO_VOLUMETRIC_FOG

#define VIELLO_GODRAYS_STRENGTH 1.0f

// Henüz aktif değil:
// #define ENABLE_VIELLO_VOLUMETRIC_CLOUDS

Ayrıca SpeedTree’nin kendi config tarafında çalışan şu define’ler de var:

speedtree sistemi defineler ve değişenler:
Genişlet Daralt Kopyala
#define USE_SPEEDGRASS
#define WRAPPER_RENDER_SELF_SHADOWS
#define WRAPPER_USE_FOG


  • DirectX9Ex geçişini oturttuk. Eski DX8 mantığından çıkıp client’i DX9Ex tarafına taşıdık, shader ve yeni render efektlerinin önünü açtık.
  • Su sistemini baştan geliştirdik. Dalgaları güçlendirdik, fresnel, derinlik hissi, kıyı köpüğü, karakter ripple’ı ve splash ekledik. Sonra suya girince crash, beyaz üçgen splash, kıyıda saçma dikdörtgen köpük gibi sorunları tek tek toparladık.
  • Karakter su etkileşimini düzelttik. Yürürken ve binekte arkadan su sıçraması, küçük halkalar ve daha yumuşak dalga tepkisi ekledik. Çok yapay durduğu yerleri de yoğunluk ve hızla ayarladık.
  • God Rays ekledik ve güçlendirdik. İlk hali çok zayıftı, güneş yönüne göre daha belirgin hale getirdik. Sonra sisle birlikte çalışabilecek yapıya oturttuk.
  • Volumetric fog sistemi yaptık. Harita bazlı çalışan sis ekledik, msenv ve map mantığıyla derinlik hissi vermeye başladık. Çok ağır çalıştığı için slice sayısını sonradan performans tarafında sınırladık.
  • DDS/TGA grass sistemi yaptık. Zeminin texture’ına göre otomatik çim ürettik, manuel yerleştirme mantığından çıktık. Yoğunluk, spacing, yükseklik ve farklı bitki tiplerini TXT’den kontrol eder hale getirdik.
  • SPT vegetation sistemini ekledik. SpeedTree modellerini çim gibi kullanmaya başladık. Kendi bark/leaf texturelarını buluyor, RENDER_PARTS, MODEL_SCALE, HEIGHT_OFFSET, density, spacing gibi değerlerle yönetiliyor.
  • SPT branch/leaf görünmeme sorunlarını düzelttik. İlk başta dallar veya bazı parçalar kayboluyordu, materyal ve render part mantığını düzelterek tam görünür hale getirdik.
  • %100 grass’ta boşluk ve kare desen sorunlarını azalttık. Grid yerleşimini ve coverage mantığını değiştirip daha dolu ve daha doğal dağılım yaptık.
  • Performans bütçe sistemi ekledik. Çim, SPT, sis slice ve çizim mesafelerini tek tek sınırlandırıp TXT’den değiştirilebilir hale getirdik. Her ayar için tekrar client derleme zorunluluğunu kaldırdık.
  • Performans log sistemi yaptık. deform, reflection, shadow, scene, water, grass, fog gibi aşamaları ayrı ayrı loglamaya başladık. Böylece FPS düşüşünü körlemesine değil, hangi pass yoruyor diye bakarak çözmeye başladık.
  • Yansımanın fazla kaynak tükettiğini tespit ettik. Loglarda reflection kısmının bazı sahnelerde 12–14 ms civarına çıktığını gördük. O yüzden gereksiz tekrar çizim ve yansıma maliyetinin ciddi olduğunu netleştirdik.
  • SpeedTree rüzgâr zamanlamasını düzelttik. Önceden aynı frame’de birden fazla kez rüzgâr zamanı ilerliyordu, ağaçlar anlık tıklıyor ve snap yapıyordu. Tek render-frame clock mantığına geçirip aynı frame’de bütün pass’lerin aynı wind matrisi kullanmasını sağladık.
  • Ağaç dallarının anlık yukarı fırlama sorununu çözdük. Shader register tarafında wind matrix register’ı yanlışlıkla başka değerle eziliyordu. O register çakışmasını kaldırınca dalların anlık kırılıp sıçraması düzeldi.
  • Ağaç gölge/flicker sorununu düzelttik. Rüzgâr varken ağacın karanlık-aydınlık arasında gidip gelmesi vardı. Wind deformasyonu ile shadow caster/receiver tarafını aynı matrise bağladık, shadow hesabını daha stabil hale getirdik.
  • Genel shadow receiver mantığını düzelttik. Sadece ağaç değil, zemin, duvar ve objeler de gölgede kararıp açılıyordu. PCF, bias, ambient floor ve ortak shadow sampling mantığıyla bunu stabilize ettik.
  • Güneş almayan taraftaki aşırı kararma sorununu düzelttik. Shadow sonucu ambient ışığı fazla eziyordu. Gölge tarafında minimum ambient katkı bırakarak yüzeyin bir anda simsiyah olup açılmasını azalttık.
  • Shadow map viewport hatasını düzelttik. Render target boyutundan taşan viewport kullanımı vardı. size + 2 mantığını düzelttik, sınır dışına taşmayı engelledik.
  • Shadow stabilizasyonundaki eski 128 sabitini kaldırdık. 1024–2048 shadow map kullanırken hâlâ 128’e göre snap yapıyordu. Gerçek shadow map çözünürlüğüne göre hesaplatınca kamera hareketinde shadow zıplaması azaldı.
  • SpeedTree memory leak riskini temizledik. Parent-instance tarafında shared_ptr döngüsü oluşturabilecek yapı vardı. Ownership zincirini kırarak leak riskini azalttık.
  • Tree shader’daki çift lighting çarpımını düzelttik. Işık sonucu bazı yerlerde iki kere çarpılıyordu, küçük shadow farkı bile aşırı kararma yapıyordu. Tek doğru lighting hesabına çektik.
  • Sert specular/shadow eşiklerini kaldırdık. 0.25 altı başka, üstü başka gibi sert geçişler flicker üretiyordu. Daha yumuşak ve sürekli bir hesap yaptık.
  • GR2 modellerinde yaklaşınca tek seferlik titreme sorununu düzelttik. LOD değişiminde model bir frame yanlış deform/LOD durumuna geçiyordu. LOD hysteresis ve ön deform mantığıyla yaklaşırken çıkan o tek karelik flicker’ı kestik.
  • Ağaç ve GR2 flickerını aynı temel mantıkta toparladık. Yani temel olay şu oldu: render pass’lerde aynı frame verisi kullanılacak, shader registerları ezilmeyecek, LOD ve shadow geçişleri sert olmayacak.
  • Texture/material tarafında eksikleri toparladık. PNG/JPG/JPEG/DDS/TGA yükleme taraflarında eksik destekleri ekledik, bazı materyallerin pembe/siyah veya görünmez çıkmasını düzelttik.
 
isikliss.webp


lambaların efektlerinin yere ve çevreye yansıması karakter ve binek efektlerini bilerek açmadım, dileyen eklediğim koddan rahat şekilde açar alt yapısı hazır
 


Performans Define'lar:
Genişlet Daralt Kopyala
#define ENABLE_VIELLO_FILE_LOADER_POOL // 2 readers; undefine for single-reader fallback
#define ENABLE_VIELLO_MAP_READAHEAD
#define ENABLE_VIELLO_GR2_WARM_CACHE
#define ENABLE_VIELLO_MAP_ASSET_CACHE
#define ENABLE_ENTITY_OUTLINE
#ifdef ENABLE_ENTITY_OUTLINE
#define OUTLINE_COLOR_TARGET D3DCOLOR_ARGB(220, 0, 200, 255)
#define OUTLINE_COLOR_ENEMY D3DCOLOR_ARGB(220, 0, 255, 0)
#define OUTLINE_COLOR_STONE D3DCOLOR_ARGB(220, 255, 200, 0)
#define OUTLINE_COLOR_BOSS D3DCOLOR_ARGB(220, 255, 0, 200)
#define OUTLINE_SCALE_FACTOR 1.03f
#endif
#define ENABLE_VIELLO_RENDER_BUDGETS
#define ENABLE_VIELLO_ACTOR_GROUPING
#define ENABLE_EFFECT_UPDATE_OPTIMIZATION
#define ENABLE_PARTICLE_COLOR_BATCHING // V43.46: Valyrian vertex-color batching on the DX9 stream
#define ENABLE_EFFECT_RENDER_STATE_BATCHING // V43.46: share state scope, preserve draw order
#define ENABLE_CPP_PSM    // Native player effect and motion registrations

Bunların dışında GPU Skinning olayları da var ilk tur optimizasyon. alt taba aldığımda ve anlık yeni gr2 yüklendiğinde fps 60'ın altına düşüyor geri çıkıyor ve haritadan ışınlanana kadar belirli algoritma ve mantıklarla ramde tutuluyor, ışınlanınca aynı olanlar hariç farklı gr2ler efektler vs siliniyor ilgili mapinkiler yükleniyor. Sil tekrar yükle sil tekrar yükle mantığını kaldırdım. Şimdi LOD la ilgili düzenlemelerde çalıştırıyorum yapay zekayı bakalım ondan sonra nasıl bir değişim olacak.
 
Performansa grafikten daha çok önem veren biri olarak; videodaki optimizasyon fikri windows 7/eski pc dönemine etki eden türden bir optimizasyon bence. Günümüzdeki imkanlarla ve eldeki donanımlarla bu tarz göze kötü görünen optimizasyonlar yerine daha modern yollara başvurulabilir.
Mesela bir mobun görünürlük mesafesi 5000.0f ise;
ilk 1500de 60 FPS, 3000de 45FPS, 4000-4500 sonrasında da 30 fps ile render/deform edilebilir. Böylelikle işlemci üzerindeki yük kademeli olarak düşmüş olur. Özellikle de directx11/12 de gpu skinning/batch/queue render yapısını kullanmak çok daha verim sağlayacağı gibi bu tarz eski modernizasyonları da çöpe atar. Directx9 ile de benzer yollar izlenip yapılabilir belki, ancak kısıtlamalara takılması/sınırları zorlaması muhtemel. Tüm bunların haricinde bilinmesi gereken şey ise metin2nin asıl problemi grafik çizim değil cpu darboğazlarıdır. Yani kalabalık ortamlarda vb. FPS düşüşünün asıl büyük suçlusu tek threadli c++ / render mimarisi-yapısı.
Bunların bir kısmı shader ile GPU tarafına aktarılırken kalan kısmının da c++ tarafında modernize edilmesi gerekiyor.
 
Optimizasyonlar:
Genişlet Daralt Kopyala
V43.50 — Outline çiziminin yalnızca fare üzerindeki görünür aktöre uygulanması.
V43.50 — Outline açma/kapatma ayarı.
V43.51 — PC/NPC/mob motion tablolarının paylaşılması ve lazy motion binding.
V43.51 — Irk/şekil bazlı LOD dosyası önbelleği.
V43.51 — Bulunmayan LOD dosyalarının negatif önbelleğe alınması.
V43.51 — Tekrarlanan model ve başlangıç animasyonu preload isteklerinin azaltılması.
V43.52 — Görüş dışındaki aktörlerin sıralama ve render bütçesinden önce elenmesi.
V43.52 — Opak/saydam sıralama vektörlerinin yeniden kullanılması.
V43.52 — Karakter/efekt bütçe seçiminde çalışma vektörlerinin yeniden kullanılması.
V43.52 — p95/p99 kare süresi ve takılma sayaçları.
V43.53 — Aktör render geçişinde view/projection matrisi önbelleği.
V43.54 — Ortak gölge sabitleri, dokuları ve sampler durumlarının geçiş bazında paylaşılması.
V43.55 — Boş mesh geçişlerinde gereksiz shader/FVF/buffer/texture hazırlığının atlanması.
V43.55 — Yalnızca kullanılan rigid/deform vertex buffer’ın bağlanması.
V43.55 — Ardışık aynı materyallerde tekrarlanan apply/restore işlemlerinin azaltılması.
V43.55 — Aktör çizimi CPU-submit ölçümü.
V43.56 — Rigid ve opak Metin Taşı gövdelerinde DX9 instancing.
V43.56 — Taşların race, seçilmiş LOD modeli ve materyal rengine göre gruplanması.
V43.56 — Uyumsuz modellerde güvenli normal çizim yolu.
V43.57 — Opaklık, boş ek LOD slotu ve materyal eşdeğerliği kontrollerinin düzeltilmesi.
V43.57 — Taşlarda lazy motion binding.
V43.57 — Harita girişinde mob/taş kaynaklarının ön yüklenmesi.
V43.57 — Harita bazlı preload manifest desteği.
V43.57 — GR2/LOD, texture, motion ve attachment efekt kaynaklarının hazırlanması.
V43.57 — Dinamik doğan mobların geç kaynak hazırlığı.
V43.57 — Harita kapsamlı kaynak pinleme ve güvenli referans bırakma.
V43.57 — Ortak efekt kaynaklarının ayrı efekt örnekleriyle kullanılması.
V43.57 — Efekt template taşması, sahipliği ve idle temizliğinin düzeltilmesi.
V43.57 — Instancing eleme koşulları ve fallback sayaçları.
V43.58 — Mesafeye göre CPU görsel poz güncelleme kademeleri.
V43.58 — Orta mesafede 45 Hz, uzak mesafede 30 Hz poz örneklemesi.
V43.58 — Kademe histerezisi ve VID bazlı güncelleme fazları.
V43.58 — Hassas aktör durumlarında tam poz güncellemesi.
V43.58 — Kemik pozlarının ve CPU deform vertex buffer’ının yeniden kullanılması.
V43.58 — Değişmeyen taş ölçeğinde matris ve collision rebuild işlemlerinin atlanması.
V43.58 — Rigid modellerde gereksiz GPU skin buffer hazırlığının atlanması.
V43.58 — Grafikler kapalıyken taş instancing shader yolu.
V43.58 — CPU update/transform/deform ve poz yeniden kullanım ölçümleri.
V43.59 — Çok mesh’li ve çok materyal alt gruplu rigid taş instancing.
V43.59 — Model başına önbellekli çizim planı.
V43.59 — DISCARD/NOOVERWRITE dinamik matris ring buffer.
V43.59 — Parça bazlı çizim tamamlanma takibi.
V43.59 — Geç çizim hatasında yalnızca eksik parçaların normal yoldan tamamlanması.
V43.59 — Çift gövde/parça çiziminin önlenmesi.
V43.59 — Ayrıntılı mesh, parça, draw ve DX9 hata sayaçları.
V43.60 — Karakter seçim/oluşturma ışıklarının haritaya sızmasının düzeltilmesi.
V43.60 — Önizleme ışık, materyal ve ambient durumlarının kapsamlı geri yüklenmesi.
V43.60 — Flying efekt kaynaklarının tekrar yüklenmeden yeniden kullanılması.
V43.60 — Önceden yüklenmiş flying kaynaklarına indeks bağlama düzeltmesi.
V43.60 — Tekrarlanan flying kayıtlarının ve indeks çatışmalarının güvenli yönetimi.

Bu sabahtan beri @Kaiser in dedikleri çok işime yaradı, baya bir yol kat ettik şu an +1500 ayı ve var olan default 1. köy mob'uyla neredeyse full 60 fps alabiliyorum tabiki ilk kez karşılaşılan veya regen'de listelenmemiş bir çağrı yaptıysam anlık 45 seviyelerine inip tekrar 60ları bulailiyoruz. eskiden 100 yan yana metinde 20-30lara düşen fps şimdi tonlarca metin ve slot'la beraber gayet kafi oynanabilirlik düzeyinde seyrediyor genellikle +45 seviyelerinde, gerçek oyunda bu kadar efekt, isimler vb şeyleri açık oynayan pek yok ama niyetim full+full efektli halde 61 fps seviyesinde +1500 metinli haritada gezip farm yapabilmek. Slotla ilgili problemleri hallettik diye düşünüyorum aşağıya da videoyu bırakıyorum. @Kaiser @Whistle @Kaptan Yosun @koray @hasanmacit özellikle efektlerle ilgili optimizasyon fikirleriniz varsa lütfen paylaşırsanız çok sevinirim

video:
 

V43.65’ten V43.118’e nereden nereye geldik?​

V43.65’e başladığımızda Ultra modda FPS 38–40 seviyelerine düşüyordu. 6091 gibi yoğun mob ve efekt bulunan bölgelerde anlık 3 FPS görüyor, haritada yürürken sektör, GR2, DDS ve efekt yüklemeleri oyunu saniyelik donduruyordu. Işınlanmalar arttıkça bellek 1.7 GB seviyesine çıkıyor, bazı kaynaklar gereksiz yere tekrar yükleniyordu.

Şu an geldiğimiz noktada normal oynanışın büyük bölümünde 61 FPS sabit. Temiz sahnelerde p95 16.50–16.75 ms, p99 16.75–17.50 ms seviyesinde. 6091 kalabalığı, Ultra grafik, haritada dolaşma, aynı haritaya ışınlanma ve farklı haritalar arasında geçiş test edildi. Yapılanların tamamı client tarafında kaldı, 32 bit sunucu paket yapısı ve protokolü korunarak client x64’e geçirildi.

Grafik, gölge ve atmosfer optimizasyonları​

  • Ultra moddaki aşırı parlaklık ve beyazlama düzeltildi.
  • Haritaların kendi güneş parlaklığı ve ortam ışığı korunarak atmosfer efektlerinin bunları ezmesi engellendi.
  • Godray ve güneş huzmeleri daha kontrollü hale getirildi.
  • Ultra grafik maliyeti reflection, shadow, scene effect, fog ve post process olarak ayrı ayrı ölçülmeye başlandı.
  • Terrain katmanlarında sıfır alpha olmayan yüzeylerin yanlışlıkla kaybolmasına neden olan shader koşulu düzeltildi.
  • Post process kaynak zinciri düzeltildi. Geçersiz veya eski render kaynağının tekrar kullanılması engellendi.
  • Terrain, ağaç, obje ve transparan sahne çizimleri için ayrı GPU ölçümleri eklendi.
  • Ağaçlardan önce zemin depth’i hazırlanarak gereksiz yaprak ve transparan piksel çizimi azaltıldı.
  • Reflection güncellemesi kamera hareketine ve belirlenen aralığa bağlandı. Her kare gereksiz reflection yenilenmesi kaldırıldı.
  • SpeedTree yapraklarının görünür sahne ve gölge geçişlerinde aynı rüzgâr pozunu kullanması sağlandı.
  • Ağaç gölgelerindeki alpha cutout ve mip seçimi düzeltildi.
  • Uzak ağaç gölgelerinin güncellenme sıklığı düşürüldü, yakın ağaçlar canlı tutuldu.
  • Statik çevre geometrisi ile hareketli ağaç gölgeleri birbirinden ayrıldı.
  • Statik gölgeler için bellek bütçeli cache eklendi. Aynı bina ve çevre objeleri her gölge yenilemesinde baştan çizilmiyor.
  • Su bulunmayan terrain piksellerindeki ripple ve gereksiz su texture okumaları kaldırıldı.
  • Gölge composite ve reflection render state geçişleri güvenli şekilde toparlandı.
  • Terrain ışık ve shader sabitlerinin patch başına tekrar tekrar gönderilmesi azaltıldı.
  • Terrain materyal sıralaması ve çizim koşulları düzenlendi.
  • Ağaç ve terrain aydınlatması aynı referans ışık sistemi üzerinden çalışacak şekilde toparlandı.
  • Shader’lar için disk ve runtime cache altyapısı eklendi. Shader oluşturma başarısız olursa eski güvenli shader yolu korunuyor.
  • Gerstner dalgaları, kıyı sabitleme, kuru alan maskesi, hareketli köpük ve mesafeye göre kalite kullanan yeni su shader’ı eklendi.
  • Güneş lens flare, sis ve yönsel ışık birbirinden ayrıldı.
  • Harita bazlı sis kuralları eklendi.
  • Güneş huzmeleri depth tabanlı sky mask, yarım çözünürlük ve tek final composite geçişine alındı.
  • Atmosfer ve skybox tarafında pahalı işlemlerin maliyeti ayrı ayrı loglandı.

Terrain ve sektör yükleme sistemi​

  • Komşu sektörlerin kaynaklarını oyuncu oraya gelmeden hazırlayan warmup sistemi eklendi.
  • Terrain materyal cache’inde cihaz texture pointer’ı tutmak yerine güvenli materyal kimliği tutulmaya başlandı.
  • Bekleyen terrain ve area sektörleri tekrar kullanılmaya başlandı. Aynı sektörün baştan kurulması azaltıldı.
  • Area içindeki ağaç, bina, efekt ve dungeon kurulum süreleri ayrı ayrı ölçülmeye başlandı.
  • Harita yüklenirken SpeedTree ana kaynakları önceden hazırlanıyor.
  • Kullanılmayan mob ve NPC hareket dosyaları başlangıçta topluca yüklenmek yerine ihtiyaç anında yükleniyor.
  • Terrain height, attr, water, patch üretimi ve vertex upload sürelerine ayrıntılı log eklendi.
  • Terrain height sorguları için hızlı index/cache yolu oluşturuldu.
  • Terrain texture yüklemeleri sıraya alındı. İlk dört saniyede kontrollü warmup uygulanıyor.
  • Büyük terrain texture’larının aynı kareye yığılması engellendi.
  • Terrain patch üretimi kare başına 6 patch olacak şekilde bölündü.
  • Terrain sector tamamen hazır olmadan aktif sahneye yayınlanmıyor. İlk girişte görülen saydam zemin problemi bu şekilde düzeltildi.
  • Terrain splat üretimi kare başına tek katmana bölündü.
  • Ölçümde terrain splat işi ortalama 0.74 ms, p95 3 ms, maksimum 5 ms seviyesine kadar indirildi.
  • Terrain ve Area için ayrı 16 sektörlük sıcak cache oluşturuldu.
  • Oyuncu geri döndüğünde sektör dosyası okunmadan ve objeler yeniden kurulmadan hazır sektör kullanılıyor.
  • Cache sınırı aşılırsa eski sektörler tek karede topluca silinmiyor, saniyede bir tane tahliye ediliyor.
  • Harita formatını değiştiren birleşik binary sistem incelendi fakat kullanılmadı.
  • Mevcut AreaData, AreaProperty, height.raw, attr.atr, water.wtr, DDS ve diğer harita dosyaları korunarak streaming sistemi geliştirildi.
  • Sunucu ve WorldEditor tarafında format değişikliği yapılmadı.

CPU, thread ve kaynak yükleme optimizasyonları​

  • Client için dört worker kullanan CPU iş kuyruğu eklendi.
  • Büyük işler küçük parçalara bölünüyor, gerektiğinde ana thread de kuyruğa yardım ediyor.
  • Pack okuma, kopyalama, bekleme ve owner thread resource oluşturma süreleri ayrı ölçülüyor.
  • Pack kilidinde bekleme ve kilidi tutma süreleri loglanıyor.
  • Arka plan dosya okuma ve read-ahead sistemi eklendi.
  • Client hangi haritada hangi kaynakların kullanıldığını öğrenip sonraki girişte bunları erkenden hazırlıyor.
  • Öğrenilmiş kaynak sistemi GPU objesi oluşturmuyor, sadece dosya baytlarını read-ahead cache’e alıyor.
  • Böylece görünmeyen skybox, GR2 ve DDS kaynaklarının oyun sırasında gereksiz yere GPU’ya yüklenmesi engellendi.
  • Worker thread üzerinde image decode, ana thread üzerinde sadece D3D9 texture oluşturma sistemi kuruldu.
  • Kaynak bırakma işlemleri kare başına adet ve süre bütçesine bağlandı. Yüzlerce kaynağın aynı karede silinmesi engellendi.
  • Loading ekranında bekleyen kaynak işleri oyun açılmadan önce kontrollü şekilde tamamlanıyor.
  • Ağır loglar kapatıldı. P95, p99 ve gerçek stall kayıtları açık bırakıldı.
  • Aynı bilgiyi sürekli yazan GPU, terrain, outline ve submit kayıtları sınırlandırıldı.

Efekt ve parçacık sistemi​

  • Efekt build, update, submit, draw ve quad maliyetleri ayrı ölçülmeye başlandı.
  • Parçacık hazırlama işi worker thread’lere bölündü fakat çizim sırası korunuyor.
  • Particle quad verisi GPU’da yeniden oluşturuluyor. Quad başına veri 144 bayttan 64 bayta düşürüldü.
  • 4096 elemanlık tekrar kullanılan GPU ring buffer eklendi.
  • Particle texture atlas altyapısı eklendi.
  • Ekranda görünmeyen efektlerin her kare güncellenmesi kaldırıldı.
  • Canlı efekt sayısına göre 66, 100, 167 ve 250 ms güncelleme aralıkları uygulanıyor.
  • 3000 üzeri canlı efektte kare başına en fazla 64 gizli efekt güncelleniyor.
  • Gizli efektlerin CPU bütçesi yoğun sahnede yaklaşık 1.25 ms ile sınırlandı.
  • Önceki karede görünen efektler ve property light efektleri tam hızda tutuluyor.
  • Gizli efektlerin aynı anda uyanıp tek kareye yığılması engellendi.
  • Görünür efekt bütçesi yoğunluğa göre 220, 180 ve 140 olarak kademelendirildi.
  • Adaptif kalite yükseldikçe uzaktaki korunmayan efekt bütçesi düşürülüyor.
  • Yakın efektler ve önemli ışık kaynakları korunuyor.
  • 6091 testinde asıl sorunun isimler değil efekt güncellemesi olduğu loglardan bulundu.
  • Effect update en ağır karede 56.28 ms’ye çıkıyordu. Değişikliklerden sonra ortalama 0.94–1.36 ms seviyesine indi.
  • Half resolution particle ve terrain katman birleştirme altyapısı eklendi. Bunlar destek ve kalite koşullarına göre devreye giriyor.

GR2, taşlar, objeler ve NPC’ler​

  • Aynı rigid taş ve obje parçalarının tek çizim verisine birleştirilmesi sağlandı.
  • Gövde ve gölge çizimlerinde ayrı ayrı küçük draw call göndermek yerine birleşik çizim kullanılıyor.
  • Taşların shadow depth çizimi instancing sistemine alındı.
  • Granny’nin serbest bıraktığı kaynak verisi daha önce güvenli şekilde kopyalanarak 64 MB bütçeli kaynak cache’inde tutuluyor.
  • Büyük dünya koordinatlarında oluşan float hassasiyet problemi düzeltildi.
  • Canonical obje karşılaştırması root noktasına göre relatif ve double ara hesapla yapılıyor.
  • Gereksiz poseChanged retleri kaldırıldı.
  • Döngüsel taş efektlerine yoğunluk bütçesi eklendi.
  • Görünmeyen taş efektlerinin yeni parçacık üretimi azaltıldı.
  • Oyuncuya en yakın 300 birimlik bölge korunuyor.
  • GR2 içindeki DDS, TGA, PNG, JPG ve JPEG bağımlılıkları model kurulmadan önce hazırlanıyor.
  • GR2 kurulumu, gerekli texture’lar hazır olana kadar erteleniyor.
  • Ana thread üzerinde aynı anda en fazla bir ağır GR2 kaynak kurulumu yapılıyor.
  • Area içindeki yaklaşık 100 objenin aynı karede kurulması kaldırıldı.
  • Obje kurulumu istemci genelinde 12 obje veya 1.5 ms bütçeyle karelere bölündü.
  • GR2 texture bağımlılıkları sonradan gerçek Granny API üzerinden okunacak şekilde düzeltildi.

İsimler ve yazı sistemi​

  • İsim seçme, yerleştirme ve render maliyeti ayrı ölçüldü.
  • TextTail render ortalaması yaklaşık 0.25 ms, ölçülen maksimum 1.38 ms çıktı.
  • İsim sisteminin ana darboğaz olmadığı kesinleştirildi.
  • Client FreeType kullanmıyor. Windows GDI ile glyph üretip GPU atlasında saklıyor.
  • ASCII ve Türkçe karakterler font oluşturulurken atlas içine önceden hazırlanıyor.
  • Mevcut text quad batching ve görünür isim limitleri korunuyor.
  • Bu yüzden ayrıca FreeType ekleyip yeni bir bağımlılık ve yük oluşturulmadı.

x64 geçişi​

  • Client tamamen x64 olarak derlenebilir hale getirildi.
  • Üretilen EXE gerçek AMD64, PE machine değeri 0x8664.
  • Granny x64 statik kütüphaneye geçirildi.
  • SpeedTree x64 statik olarak bağlandı.
  • CryptoPP, LZO, JPEG, curl, DevIL, libpng, zlib, Discord RPC, FLAC ve diğer uygun kütüphaneler x64 statik bağlantıya alındı.
  • Miles yerine x64 tarafında miniaudio kullanıldı.
  • Python 2.7 x64 statik bağlantısı korundu.
  • Wiki sistemi için x86 kütüphane yerine x64 JSON tabanlı uygulama eklendi.
  • Python ile C++ arasında taşınan pencere, texture, ikon ve callback adreslerindeki 32 bit pointer kesilmeleri düzeltildi.
  • Granny veri yapısında sabit 32 bayt varsayımı kaldırıldı, gerçek yapı boyutu kullanıldı.
  • DXT açma ve efekt klonlama yollarındaki pointer kesilmeleri düzeltildi.
  • /full komutundan sonra oluşan paket bozulmasının nedeni bulundu.
  • x64’te 8 bayta çıkan time_t alanları 32 bit sunucuyla uyumlu LONG alanlara çevrildi.
  • Kritik ağ paketlerinin boyları static_assert ile sabitlendi.
  • 32 bit sunucu opcode, paket boyu, koordinat ve network protokolü değiştirilmedi.
  • x64 için kütüphaneler MaxSpeed ile derleniyor.
  • x64 sıcak kaynak bütçesi 96 MB’ye, harita cache sınırı 1024 kaynağa çıkarıldı.
  • Pack read-ahead bütçesi x64’te 64 MB’ye çıkarıldı.
  • Windows’un RTX 4050’yi tercih etmesi için yüksek performans GPU export’ları eklendi.
  • Üçüncü taraf DLL bağımlılıklarının çoğu kaldırıldı. Şu anda kalan dış grafik bağımlılığı d3dx9_43.dll.
  • Grafik backend hâlâ DirectX9Ex. DirectX 11 veya 12’ye geçmeden x64 bellek ve CPU avantajları kullanılmaya devam ediyor.

Kare zamanlaması ve 61 FPS sabitleme​

  • QPC tabanlı hassas kare zamanlayıcısı eklendi.
  • Gerçek hedef 61.000 Hz, yani kare başına 16.393 ms.
  • Windows yüksek çözünürlüklü timer kullanılıyor.
  • Son 250 mikrosaniyede kontrollü spin uygulanarak uyku sapması azaltıldı.
  • Geç kalan karelerden sonra toplu telafi yapıp oyunu hızlandıran eski davranış kaldırıldı.
  • V43.100’de p95 17.75–18.25 ms, p99 18.25–20.75 ms seviyesindeydi.
  • V43.101 sonrasında temiz sahnelerde p95 16.50–16.75 ms, p99 16.75 ms seviyesine indi.
  • Temiz pencerelerde 33, 50 ve 100 ms üzeri kare sayısı sıfırlandı.
  • En temiz ölçümde zamanlayıcı overshoot p95 ve p99 değeri 0.25 ms çıktı.
  • Oyun işlemi ve ana thread ABOVE_NORMAL önceliğe alındı.
  • Windows dinamik öncelik desteği açık tutul

Işınlanma ve bellek kullanımı​

  • Haritalar arası geçişte eski haritanın spekülatif kaynak referansları bırakılıyor.
  • Kaynak temizliği tek karede yapılmıyor. Adet ve milisaniye bütçesiyle 15 saniyeye yayılıyor.
  • Aynı harita içindeki ışınlanmada aktif harita, GR2, doku ve sıcak kaynak cache’leri korunuyor.
  • Aynı harita warpında skybox ve terrain dokularının tekrar yüklenmesi engellendi.
  • Kullanılmayan mob ve NPC race verileri sonsuza kadar bellekte tutulmuyor.
  • Aktif modeller, oyuncu ve sabitlenmiş yarışlar korunuyor. Eski ve kullanılmayan hareket tabloları kontrollü temizleniyor.
  • Efekt şablonları ile boş particle havuzları loading sırasında küçültülüyor.
  • Çoklu ışınlanma testinde kaynak sayısı 4.327 civarında sabitlendi.
  • Önceden private bellek yaklaşık 1.71 GB seviyesine çıkıyordu. Son testlerde 1.35-1.40 GB civarında plato yaptı.
  • 90 saniye sonunda bekleyen kaynak, pending delete ve referanssız kaynak sayısı sıfıra indi.
  • Aynı haritada VoiceChat’in her ışınlanmada kapatılıp açılması kaldırıldı. Önceden 124-135 ms süren işlem sıfıra indi.
  • Loading kuyruğu oyun açıldıktan sonraki ilk yürüyüşe bırakılmak yerine loading ekranında 80 ms bütçeyle tüketiliyor.

Simge durumuna küçültme​

  • Oyun 10 dakika simge durumunda test edildi. Siyah ekran, device lost veya D3D reset hatası oluşmadı.
  • Simge durumundayken tam oyun döngüsü 100 Hz yerine 10 Hz çalışıyor.
  • Render kapalı kalırken ağ, dünya, lonca, ses ve hesap işlemleri çalışmaya devam ediyor.
  • Başka pencereye geçmek bu sistemi açmıyor. Yalnızca oyun gerçekten simge durumundaysa devreye giriyor.
  • Oyun geri açıldığında kare zamanlayıcısı sıfırlanıp doğrudan 61 FPS düzenine dönüyor.

Log sistemi​

  • Başlangıçta darboğaz bulmak için terrain, efekt, resource, pack, area, GR2, texture, frame, GPU ve bellek tarafına ayrıntılı loglar eklendi.
  • Darboğazlar bulunduktan sonra her kare yazılan gereksiz loglar kapatıldı.
  • Yalnızca p95/p99 kare süresi, gerçek stall olayları, uzun texture yüklemeleri, warp belleği ve önemli sistem değişimleri açık bırakıldı.
  • Yavaş olay log bütçesi saniyede 32 satırdan 4 satıra indirildi.
  • Böylece log sisteminin kendisinin disk ve CPU yükü oluşturması engellendi.

Ağaç ölçek sistemi​

  • SpeedTree boyutu CFG üzerinden ayarlanabilir hale getirildi.
  • İlk denemede bütün ağaçlar üç kat büyütüldü.
  • Daha sonra genel ölçek tekrar yüzde 100’e alındı.
  • metin2_map_a1, metin2_map_b1 ve metin2_map_c1 için harita bazlı yüzde 200 ölçek tanımlandı.
  • Gövde, yaprak, billboard, gölge ve culling sınırları birlikte ölçekleniyor.
  • Çarpışma verisi özgün boyutta korunuyor. Ağaç büyüdüğü için mevcut yollar kapanmıyor.

Atlas üzerinden otomatik yürüme​

  • M ile açılan atlas haritasına Shift + sol tık ile otomatik yürüme eklendi.
  • 117 harita için attr.atr verisinden navigasyon gridleri üretildi.
  • A* sekiz yönlü yol buluyor ve çapraz şekilde blokların içinden geçmiyor.
  • Yol dokularına öncelik veriliyor, engebeli araziye daha yüksek maliyet uygulanıyor.
  • Tıklanan yer blokluysa aynı bölgede yürünebilir en yakın nokta bulunuyor.
  • Yol atlas üzerinde sarı noktalarla, dünyada yön çizgisiyle gösteriliyor.
  • .mdatr ve dinamik obje çarpışmaları yürüyüş sırasında takip ediliyor.
  • Karakter 1.4 saniye ilerleyemezse engelin önü geçici olarak bloklanıp rota tekrar hesaplanıyor.
  • Alternatif rota bulunamazsa önce dört farklı sağ-sol kaçış yönü deneniyor.
  • Hâlâ sıkışmışsa karakter kontrollü şekilde sarı rota üzerindeki ileride bulunan 10-15 noktadan güvenli olana taşınıyor.
  • Kurtarma mesafesi, kullanım sayısı ve bekleme süresi sınırlandırıldı. Sistem sınırsız şekilde teleport yapamıyor.
  • Normal hareket tuşu, zemine tıklama, hasar alma, harita değiştirme veya Escape rotayı iptal ediyor.
  • Sunucu tarafında yeni paket eklenmedi. Sistem mevcut karakter hareket paketlerini kullanıyor.

Sonuç olarak nereden nereye geldik?​

Başlangıçta Ultra modda 38-40 FPS, kalabalık efektlerde birkaç FPS, sektör geçişlerinde 100-400 ms donmalar ve ışınlandıkça büyüyen bellek vardı.

Şu an kararlı sahnelerde 61 FPS, 16.50-16.75 ms p95 ve yaklaşık 16.75-17.50 ms p99 kare zamanı görüyoruz. Efekt update yükü 56 ms seviyesinden yaklaşık 1 ms seviyesine, demirci dokusundaki 153 ms takılma 8 ms altına, aynı harita ses yeniden kurulumu 124-135 ms’den sıfıra indi. Çoklu ışınlanmadan sonra bellek büyümeye devam etmek yerine yaklaşık 1.35-1.40 GB çevresinde dengeleniyor.

Bunların tamamını harita formatını, sunucu protokolünü ve 32 bit sunucuyu değiştirmeden yaptık. İstemci x64, sunucu 32 bit çalışmaya devam ediyor.

 
Son düzenleme:
  • Granny veri yapısında sabit 32 bayt varsayımı kaldırıldı.
Burda neresi kastediliyor tam olarak? Defaultta tpnt zaten 32byte, tpnt2ler 40byte. "Varsayım" kısmı gözüme çarpmadı hiç, ya da dikkat etmedim bilemiyorum
 
Burda neresi kastediliyor tam olarak? Defaultta tpnt zaten 32byte, tpnt2ler 40byte. "Varsayım" kısmı gözüme çarpmadı hiç, ya da dikkat etmedim bilemiyorum
Benim kodlarda model.cpp dosyasında

bool CGrannyModel::LoadMeshs():
Genişlet Daralt Kopyala
eski:
granny_int32x grni32xTypeCount =
    GrannyGetTotalTypeSize(
        pgrnMesh->PrimaryVertexData->VertexType
    ) / 32;
    
yeni:

const granny_int32x grni32xTypeCount =
    GrannyGetTotalTypeSize(pgrnMesh->PrimaryVertexData->VertexType) /
    static_cast<granny_int32x>(sizeof(granny_data_type_definition));

değişmiş oldu yapay zeka açıklaması ise :

Granny’nin model bilgilerini tutan granny_data_type_definition isimli bir veri yapısı var.

Eski kod bu yapının boyutunu her sistemde 32 bayt kabul ediyordu. Bu varsayım 32 bit istemcide tesadüfen çalışıyordu. x64’e geçince yapı içindeki pointerlar 4 bayttan 8 bayta çıktığı için yapının gerçek boyutu değişti.

Kod hâlâ 32 bayt üzerinden ilerleyince:

  • Bellekte yanlış adrese gidiyordu.
  • Dizinin sınırını aşıyordu.
  • GR2 model yüklenirken bozuk pointer okuyordu.
  • Karakter seçiminden sonra CGrannyModel::LoadMeshs içerisinde istemci kapanıyordu.
Sabit değer kaldırılıp gerçek boyut kullanılmaya başlandı:
Yani kod artık veri yapısının 32 veya 64 bit sistemdeki gerçek boyutunu kendisi hesaplıyor. Bu düzeltme GR2 dosyasını değiştirmedi; yalnızca x64 istemcinin Granny verisini bellekte doğru okumasını sağladı.
 
Geri
Üst