zoraki

Aktif üye
12 Şub 2018
142
42
28
(6) Ankara
Selam arkadaşlar dövüş sistemi kuruyorum ancak bir performans/hassasiyet ikilemi arasında kaldım. Fikirlerinize ihtiyacım var.
Haritada yaklaşık 100-150 aktif karakter (AI ve Player) bulunacak. Saldırı animasyonlarım oldukça hızlı, bazı vuruş pencereleri (Notify Begin/End arası) 0.10s - 0.15s gibi çok dar bir aralıkta gerçekleşiyor.
Mevcut Yapı: SphereTraceMulti ile frame-to-frame (Last Location - Current Location) tarama yapıyorum.

YAŞADIĞIM SORUN

1. Set Timer by Function Name:
0.01s aralıkla çalıştırdığım Timer, düşük FPS veya sunucu yükü anlarında kararsızlaşıyor. Trace sayısı (bazı vuruşlarda 2, bazılarında 5 kare gibi) tutarsız çıkıyor. Ayrıca ilk karede LastTraceLocation verisi henüz güncellenmediği için ilk trace geriden başlayabiliyor veya hiç oluşmuyor.

2.Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

3.Tunnelling (Tünelleme): Özellikle düşük FPS durumlarında kılıç, düşman collision'ının içinden hasar vermeden geçebiliyor.

Tecrübelerinize dayanarak şu sorulara cevap arıyorum:
AnimNotifyState (ANS) vs Event Tick:
ANS içindeki NotifyTick fonksiyonunu kullanmak, global Event Tick kullanımına göre performans (CPU cycles) açısından kayda değer bir avantaj sağlar mı?
Nekdar doğru bilmiyorum ama Network'de araştırmalarıma göre. ANS Even tick için fps drop esnasında Tunnelling gerçekleşebiliyormuş.

Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

Sektör standartlarında, bu ölçekteki projelerde "kare kaçırmayan" ama sunucuyu da yormayan en stabil yaklaşım nedir?
 
Son düzenleme:
Selam arkadaşlar dövüş sistemi kuruyorum ancak bir performans/hassasiyet ikilemi arasında kaldım. Fikirlerinize ihtiyacım var.
Haritada yaklaşık 100-150 aktif karakter (AI ve Player) bulunacak. Saldırı animasyonlarım oldukça hızlı, bazı vuruş pencereleri (Notify Begin/End arası) 0.10s - 0.15s gibi çok dar bir aralıkta gerçekleşiyor.
Mevcut Yapı: SphereTraceMulti ile frame-to-frame (Last Location - Current Location) tarama yapıyorum.

YAŞADIĞIM SORUN

1. Set Timer by Function Name:
0.01s aralıkla çalıştırdığım Timer, düşük FPS veya sunucu yükü anlarında kararsızlaşıyor. Trace sayısı (bazı vuruşlarda 2, bazılarında 5 kare gibi) tutarsız çıkıyor. Ayrıca ilk karede LastTraceLocation verisi henüz güncellenmediği için ilk trace geriden başlayabiliyor veya hiç oluşmuyor.

2.Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

3.Tunnelling (Tünelleme): Özellikle düşük FPS durumlarında kılıç, düşman collision'ının içinden hasar vermeden geçebiliyor.

Tecrübelerinize dayanarak şu sorulara cevap arıyorum:
AnimNotifyState (ANS) vs Event Tick:
ANS içindeki NotifyTick fonksiyonunu kullanmak, global Event Tick kullanımına göre performans (CPU cycles) açısından kayda değer bir avantaj sağlar mı?
Nekdar doğru bilmiyorum ama Network'de araştırmalarıma göre. ANS Even tick için fps drop esnasında Tunnelling gerçekleşebiliyormuş.

Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

Sektör standartlarında, bu ölçekteki projelerde "kare kaçırmayan" ama sunucuyu da yormayan en stabil yaklaşım nedir?
Ben oyunum için tren ile açılış sahnesi yapmıştım. Oyunum multiplayer.
Oyuncular trende oturur pozisyonda başlıyorlar ve tren 10-15 saniye hareket ediyor ışıkları yanıp sönüyor ve bir durakta elektrik kesintisi sebebi ile durması gerekiyordu. Curve oluşturup timeline ile treni hareket ettiriyorum. Fakat delay ile timer ile bu işi yaptığımda fark ettim ki , her oyuncudan FPS bağımsız çalıştığı için konum senkronizasyonu oluyor. Örneğin serverde olursa daha kritik. Çünkü trenin hareket yükü servere biniyor. Eğer serverin bilgisayarı yeterince iyi değil ise tren daha geride durabiliyordu. Bu da istenmeyen bir şey.
Ben de timer delay vs kullanmaktansa timeline kullandım. Curve kullandım.
Sonuç başarılı fakat bu sefer de başka bir sorun çıktı ortaya.

Oyun serverde feci şekilde kasıyor çünkü 3 oyuncunun da ışık pozisyonu, trenin vagon pozisyonları, genel aktör pozisyonu ve oyuncuların da olması gerektiği pozisyonu 0.01 sn gibi bi sürede hesaplaması gerekiyor. Tren sahnesi bende 30 FPS götürüyor öyle söyleyeyim. Fakat gitmesi gereken yere gidiyor ve herkes düzgün bir şekilde ulaşıyor.

Çözümü bulamadım hala.
Selam arkadaşlar dövüş sistemi kuruyorum ancak bir performans/hassasiyet ikilemi arasında kaldım. Fikirlerinize ihtiyacım var.
Haritada yaklaşık 100-150 aktif karakter (AI ve Player) bulunacak. Saldırı animasyonlarım oldukça hızlı, bazı vuruş pencereleri (Notify Begin/End arası) 0.10s - 0.15s gibi çok dar bir aralıkta gerçekleşiyor.
Mevcut Yapı: SphereTraceMulti ile frame-to-frame (Last Location - Current Location) tarama yapıyorum.

YAŞADIĞIM SORUN

1. Set Timer by Function Name:
0.01s aralıkla çalıştırdığım Timer, düşük FPS veya sunucu yükü anlarında kararsızlaşıyor. Trace sayısı (bazı vuruşlarda 2, bazılarında 5 kare gibi) tutarsız çıkıyor. Ayrıca ilk karede LastTraceLocation verisi henüz güncellenmediği için ilk trace geriden başlayabiliyor veya hiç oluşmuyor.

2.Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

3.Tunnelling (Tünelleme): Özellikle düşük FPS durumlarında kılıç, düşman collision'ının içinden hasar vermeden geçebiliyor.

Tecrübelerinize dayanarak şu sorulara cevap arıyorum:
AnimNotifyState (ANS) vs Event Tick:
ANS içindeki NotifyTick fonksiyonunu kullanmak, global Event Tick kullanımına göre performans (CPU cycles) açısından kayda değer bir avantaj sağlar mı?
Nekdar doğru bilmiyorum ama Network'de araştırmalarıma göre. ANS Even tick için fps drop esnasında Tunnelling gerçekleşebiliyormuş.

Event Tick: Hassasiyet anlamında en iyi sonucu verse de, 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu (Server) tarafında ciddi bir CPU darboğazı yaratmasından endişeliyim.

Sektör standartlarında, bu ölçekteki projelerde "kare kaçırmayan" ama sunucuyu da yormayan en stabil yaklaşım nedir?
Continuous Collision Detection (CCD) ve ayarını açarsan ve sweep kullanırsan collision daha hassas olacaktır. Örneğin 1 saniyede 1 trace atıyorsa bu sefer 10 trace atacak gibi düşünebilirsin.
 
Cevabın için teşekkürler ancak aklımdaki asıl soru işareti Network Bandwidth ve Server-Side CPU optimizasyonu.

CCD ve standart fiziksel bileşenler (Collision Components) kullanmak yerine manuel SphereTrace + Timer ikilisini seçmemin temel nedeni, ağ trafiğini (Replication) minimize etmek. 150 karakterin her birinin fiziksel bileşenlerini ve collision verilerini ağ üzerinden replike etmek yerine, sadece sunucu tarafında (Authoritative) koşan 'Math-only' (vektörel konum bazlı) bir yapı kurmanın daha ölçeklenebilir olacağını düşündüm.

Ancak testlerimde şunu fark ettim: Timer ve AnimNotifyState (Tick) kullanırken, özellikle Play Rate arttığında veya FPS dalgalandığında ilk karelerde (initial frames) tarama boşlukları ve tünelleme meydana geliyor. Global Event Tick kullandığımda ise hassasiyet tam istediğim gibi (sub-frame yakın sonuç alıyorum), ancak 150 karakterin aynı anda Tick üzerinden tarama yapmasının sunucu tarafında yaratacağı CPU darboğazı ve 'Frame Spike' riski beni ciddi anlamda düşündürüyor.

Sizce 150(AI/Player) vuruşun aynı anda gerçekleştiği bir 'peak' anında; Unreal'ın kendi fizik motoru mu (CCD/Sweep), yoksa optimize edilmiş manuel döngüler mi ağ gecikmesine ve sunucu işlem yüküne daha az sebep olur? Bu ölçekte bir proje için 'Hassasiyet vs Performans' dengesini en sağlıklı nasıl kurabiliriz?

Aslında en temiz çözüm Native C++ Trace mantığı gibi duruyor ancak şu aşamada projeyi Blueprint odaklı tutmaya çalışıyorum. C++'a girmeden bu yükün altından kalkmak mümkün mü? Şimdilik en karlı yol AnimNotifyState (Tick) üzerinden gitmek gibi duruyor ama tünelleme riskini tamamen sıfırlayamadım.
 
Son düzenleme:
Şunu biraz daha açarsan daha net cevap verebilirim, 150 AI karakter bir arada mı duruyor yoksa haritaya dağınık bir şekilde mi ? 150 vuruşun aynı anda gerçekleştiği bir durumdan bahsetmişsin 1 kare ekran görüntüsü atsan bile daha anlaşılır olacaktır.

Anladığım kısmı için tavsiyem, bir adet tüm AI karakterlere manager aktör oluşturup zone sistemi oluşturman, player location a bağlı olarak player çevresinde en basit hali ile yeşil-sarı-kırmızı zone hangi AI hangi zone da ise ona göre attack/search/run... neler lazım ise bilgisini verecek. Yalnızca durum değişikliği olursa AnimNotify ile bilgisi yine AI manager üzerinden replicate edilecek, karakterler tek tek replication göndermeyecek, manager bundle olarak bilgiyi aktaracak. Player için ise hızlı hareket ettiği bir durumda doğrudan sphere collision değil, overlap trace ile hedef belirlemesi yapacaksın ki kim öldü kim kaldı derdine düşmeyesin, hedef öldü, yeni hedef belirle, yeni hedefim bu, şu hareketi yapıyorum bilgisini servera aktarabilirsin.

Burada daha birçok trick var aslında herşeyi local tutup, skip owner olarak server a aktarman faydana olacaktır ama kabaca senin logicten anladığım bu kadar. Daha derinlemesine anlatırsan yardımcı olamaya çalışırım tabii ki.
 
DMC (Devil May Cry) tarzı, çok yüksek hıza ve Play Rate değerlerine sahip bir melee (yumruk/kombo) sistemi geliştiriyorum. Projenin ölçeği gereği haritada 150 civarı aktif AI karakter bulunuyor ve yoğun savaş anlarında oyuncu 15-20 AI ile aynı anda yakın temas halinde dövüşebiliyor. Anlık olarak 20-30 karakterin aynı frame içerisinde vuruş (hitbox) döngüsünde olduğu senaryolar üzerine çalışıyorum.

Uyguladığım Yöntem:Normalde AnimNotifyState (ANS) Tick üzerinden "frame-to-frame" (Last Location - Current Location) tarama yapıyordum. Ancak yüksek hızlı animasyonlarda ve FPS dalgalanmalarında tünelleme (kılıcın/yumruğun düşmanın içinden hasar vermeden geçmesi) kaçınılmaz hale geldiği için Native C++'taki 'Fixed Timestep' mantığını Blueprint’e uyarladım.

Teknik Detay (Accumulator + While Loop):Saniyede 100 tarama (0.01s interval) yapacak bir Substepping yapısı kurdum. Amacım, render FPS'inden bağımsız, sabit bir zaman aralığıyla (fixed step) tarama yaparak boşlukları kapatmaktı.

Blueprint Yapıları:

https://blueprintue.com/blueprint/rk1y-56v/
https://blueprintue.com/blueprint/zv3wbmv_/

Yaşanan Sorun:Bu manuel substepping yapısına (her karede gerekirse çoklu trace atılmasına) rağmen, videoda görebileceğiniz üzere özellikle düşük FPS anlarında veya animasyonun en hızlı olduğu "snap" bölümlerinde milisaniyelik boşluklar oluşuyor ve tünelleme devam ediyor. Global Event Tick veya Timer denemelerimde de benzer "kare atlama" (gap) sorunlarını aşamadım.
("çoklu trace ile çözersem cpu darboğaza sokamamak için varsayım olarak 150 karakterin hepsinde bu hassas taramayı aynı anda çalıştırmak sunucuyu yoracaktır. Bu yüzden şöyle bir mantık kurmayı düşünüyorum:
  • Oyuncunun Yanındakiler: Vuruşlar çok hassas olsun (saniyede 100 trace), tünelleme hiç olmasın.
  • Uzaktaki Karakterler: Saniyede 100 yerine sadece 10-20 trace atsınlar veya standart Tick ile devam etsinler.
  • )
Ama işte frame atlama ve tünellemeyi nasıl çözecem bilmiyorum. Nekadar mantıklı ama büyükçe hit box oluşturmak var aklımda

Video (Debug İzleri): https://streamable.com/ykcfmt
  • Blueprint VM üzerinde bu kadar yüksek hızdaki (0.1s altı vuruş penceresi) yumruk animasyonları için "kare kaçırmayan" bir hassasiyet yakalamak mümkün mü, yoksa mantıkta bir hata mı yapıyorum?
  • 150 karakterlik bir havuzda sunucu taraflı (authoritative) doğrulamayı koruyarak sunucuya fazla yük bindirmeden bu tünellemeyi sıfırlamanın en iyi yolu nedir?



 
Son düzenleme:
ok şimdi daha net anlaşıldı, gördüğüm kadarıyla hareket boyunca tarama yaptırıp hit var mı diye check ediyorsun ancak super pahalı bir yöntem, sana tavsiyem hareketin tam ortasında karakter forward vectore bağlı olarak açı sınırlı single check, yani bir anim notify oluşturup hareketin tam ortasında multisphere trace ile önünde kimler var bir kez check edeceksin, IsTarget ise damage yolla yoksa pas geç.

BP mantığıyla vurduğun/ateş ettiğin ve belirlediğin açı sınırları içinde mi bu şekilde kontrol edebilirsin. Minimum hesaplama candır ;)

Screenshot_1.png
 
ok şimdi daha net anlaşıldı, gördüğüm kadarıyla hareket boyunca tarama yaptırıp hit var mı diye check ediyorsun ancak super pahalı bir yöntem, sana tavsiyem hareketin tam ortasında karakter forward vectore bağlı olarak açı sınırlı single check, yani bir anim notify oluşturup hareketin tam ortasında multisphere trace ile önünde kimler var bir kez check edeceksin, IsTarget ise damage yolla yoksa pas geç.

BP mantığıyla vurduğun/ateş ettiğin ve belirlediğin açı sınırları içinde mi bu şekilde kontrol edebilirsin. Minimum hesaplama candır ;)

Ekli dosyayı görüntüle 806
Benim tren sahnesi için öneriniz nedir peki :D
Tüm hesaplama yük servere biniyor ve 30 fps düşüş yaşıyor. Fakat tüm oyuncuların konumunu ve trenin konumunu bilmek zorunda. Timer Curve ile hesaplama yapılıyor. Normal Tick ile yaparsam bir sorun olmuyor fakat bu sefer de adamın bilgisayarı kötü ise delay/fps bağlamında erkenden durabiliyor tren ya da fazla gidebiliyor. Senkron sorunu çıkıyor.

Half life 2 tren sahnesi başlangıcını düşünün. Fakat oyuncular interaktif olarak oturuyorlar tren içinde ve birbirlerine bakabiliyorlar. Tren ise 15 20 saniye hareket edecek. Fakat bu süreçte tüm oyuncular attachlanmış ve konum bilgileri iletilmeli ki trenle aynı seviyede gittikleri belli olsun. Fakat tüm yük sunucu sahibine binmekte. Çünkü bu işlemler sunucu tarafında hesaplanıyor. Trenin lokasyonu ayrı, yanıp sönen ışıkları ayrı, vagonlar ayrı, oyuncular ayrı.
 
Ne yöntemi denediysemde Tic'de yüksek milim saniyelerle hesaplamalarda frame atlama (Tünellemeyi) engelleyemedim. Dot Product ile yaptığın bu açı kontrolü, benim için harika bir 'ön filtre' teşekkürler. İlk başta check box @nonlinear dediğin gibi yapacaktım fakat çelişkiye düştüm oyuncular ama vurdu ama hasar vermedi (ghost hit) demesinden korkuyordum. @nonlinear Dediğin gibi check box ile Başlangıç orta ve son framleri alarak iki kademede (saldırı 'Başlangıçtan Ortaya' ve 'Ortadan Bitişe' şeklinde iki aşamalı) hit box oluşturacağım bu sayede sunucuyu yüksek heplamalardan kurtarmış olcağım. Bu yöntemde Dot Product kullanmam fazladan bir yük çünkü her attack esnasında collisini aktif edip kapatmam fazladan yük. Box trace daha hafif. Milim saniyelik her kare trace atma yöntemi için mükemmel. cevabın için teşekkür ederim.

@leonscottkfm tren senaryosundaki FPS düşüşü muhtemelen her karede çok fazla aktörü veya SkeletalMesh'i manuel olarak Attach veya SetLocation ile güncellemeye çalışmandan kaynaklanıyor. Eğer her vagonu ve oyuncuyu ayrı ayrı matematiksel olarak sunucuda hesaplatıyorsan, 30 FPS kaybı normal.

Treni tek bir ana aktör (Root) yapıp, diğer her şeyi (ışıklar, koltuklar, vagonlar) bu aktöre Component olarak bağlamayı (Keep Relative) denedin mi? Sadece Root aktörü bir InterpTo veya Timeline ile hareket ettirirsen, Unreal'ın içsel transform yapısı bu yükü senin yerine optimize ederek taşır. Oyuncuları da koltuklara AttachToComponent ile bağlarsan, her karede konum hesaplamana gerek kalmaz; motor bunu transform update aşamasında otomatik halleder.

Diğer olası sorunlar;

Replication (Ağ Trafiği): Trenin içindeki her küçük parçanın (ışık, vagon vs.) 'Replicate' özelliği açık olabilir. Sadece ana treni (Root) replicate edip, diğer her şeyin replication'ını kapatmayı dene.

Client-Side: Trenin hareketini sunucuda (Server) hesaplamak yerine; sunucuda sadece 'Tren kalktı' bilgisini verip, hareketin kendisini her oyuncunun kendi bilgisayarında (Client) bir Timeline ile oynatırsan sunucu üzerindeki yükü sıfıra indirirsin." Güvenlik önemliyse yöntem işe yaramaz. ayrıca her oyuncu farklı zaman dilimlerinde bitişe uğraya bilir arada lag dan dolayı sunucudaki satard ve end zamanlarına göre istemcide ayarlaya bilirsin varış zamanalrını.

Olası sorun buda olabilir. Character Movement sisteminde veriler sunucudan istemciye milisaniyelik gecikmelerle gelir. Hızıistemci tarafında anlık update ederiz. Eğer update etmiyorsan kasılma hissi bundan da kaynaklanıyor olabilir. Sadece fps'den olamaya bilir.
 
Son düzenleme:
  • Beğen
Tepkiler: leonscottkfm
Ne yöntemi denediysemde Tic'de yüksek milim saniyelerle hesaplamalarda frame atlama (Tünellemeyi) engelleyemedim. Dot Product ile yaptığın bu açı kontrolü, benim için harika bir 'ön filtre' teşekkürler. İlk başta check box @nonlinear dediğin gibi yapacaktım fakat çelişkiye düştüm oyuncular ama vurdu ama hasar vermedi (ghost hit) demesinden korkuyordum. @nonlinear Dediğin gibi check box ile Başlangıç orta ve son framleri alarak iki kademede (saldırı 'Başlangıçtan Ortaya' ve 'Ortadan Bitişe' şeklinde iki aşamalı) hit box oluşturacağım bu sayede sunucuyu yüksek heplamalardan kurtarmış olcağım.

@leonscottkfm tren senaryosundaki FPS düşüşü muhtemelen her karede çok fazla aktörü veya SkeletalMesh'i manuel olarak Attach veya SetLocation ile güncellemeye çalışmandan kaynaklanıyor. Eğer her vagonu ve oyuncuyu ayrı ayrı matematiksel olarak sunucuda hesaplatıyorsan, 30 FPS kaybı normal.

Treni tek bir ana aktör (Root) yapıp, diğer her şeyi (ışıklar, koltuklar, vagonlar) bu aktöre Component olarak bağlamayı (Keep Relative) denedin mi? Sadece Root aktörü bir InterpTo veya Timeline ile hareket ettirirsen, Unreal'ın içsel transform yapısı bu yükü senin yerine optimize ederek taşır. Oyuncuları da koltuklara AttachToComponent ile bağlarsan, her karede konum hesaplamana gerek kalmaz; motor bunu transform update aşamasında otomatik halleder.

Diğer olası sorunlar;

Replication (Ağ Trafiği): Trenin içindeki her küçük parçanın (ışık, vagon vs.) 'Replicate' özelliği açık olabilir. Sadece ana treni (Root) replicate edip, diğer her şeyin replication'ını kapatmayı dene.

Client-Side: Trenin hareketini sunucuda (Server) hesaplamak yerine; sunucuda sadece 'Tren kalktı' bilgisini verip, hareketin kendisini her oyuncunun kendi bilgisayarında (Client) bir Timeline ile oynatırsan sunucu üzerindeki yükü sıfıra indirirsin." Güvenlik önemliyse yöntem işe yaramaz. ayrıca her oyuncu farklı zaman dilimlerinde bitişe uğraya bilir arada lag dan dolayı sunucudaki satard ve end zamanlarına göre istemcide ayarlaya bilirsin varış zamanalrını.

Olası sorun buda olabilir. Character Movement sisteminde veriler sunucudan istemciye milisaniyelik gecikmelerle gelir. Hızıistemci tarafında anlık update ederiz. Eğer update etmiyorsan kasılma hissi bundan da kaynaklanıyor olabilir. Sadece fps'den olamaya bilir.
Kasılma sadece serverde oluyor demek ki yük servere biniyor. Aslında Trenin kendisi bir Root vagonlar ise Child.
Ama dediğin doğru her oyuncu kendi konumunu oluşturmalı fakat yine değişen bir şey yok bunu bilmeleri için yine servere veri gönderip almaları gerekiyor. Yük biraz daha azalabilir belki. Fakat oyuncuların konumunda bir sıkıntı olur mu bu sefer acaba?
 
@leonscottkfm Dostum, kasılma sadece server tarafındaysa teşhis net: Sunucu, her karede (Tick) 10-15 oyuncunun ve vagonun konumunu tek tek matematiksel olarak hesaplamaya çalışırken boğuluyor.

Çözüm aslında Unreal'ın kendi temelinde gizli. Eğer Tren ve Karakter BP’lerini düzgünce Replicate ettiysen, oyuncuları trene AttachToComponent (Koltuk veya Vagon) ile bağladığın an iş biter. Unreal’ın kendi fizik ve transform motoru tren hareket edince içindekiler de onunla gider. mantığını otomatik ve en optimize şekilde arka planda halleder.

Senin Tick fonksiyonu içinde her seferinde 'oyuncu şimdi şurada, vagon burada' diye SetLocation veya manuel güncelleme yapmana hiç gerek yok. Bu manuel hesaplamaları devreden çıkardığın anda sunucudaki o kasılma tamamen kaybolacaktır. Yani motorun kendi 'bağlama' (Attachment) sistemine güven, gerisini o halletsin.

Ayrıca illa locasyon lazom diyorsan ne fonksiyonu oluşturacaksın bilmiyorum ama oluşturacağın fonksiyon için Characterlerin locasyonu lazım dersende attach ettiğin her karakterin referansını alarak o referansdan güncel konumu veya rotasyonunu alırsın. Eğer işin içinde gezinme yoksa eğer gezinme varsa işin boyutu değişe bilir
 
Son düzenleme:
  • Beğen
Tepkiler: leonscottkfm
@leonscottkfm Dostum, kasılma sadece server tarafındaysa teşhis net: Sunucu, her karede (Tick) 10-15 oyuncunun ve vagonun konumunu tek tek matematiksel olarak hesaplamaya çalışırken boğuluyor.

Çözüm aslında Unreal'ın kendi temelinde gizli. Eğer Tren ve Karakter BP’lerini düzgünce Replicate ettiysen, oyuncuları trene AttachToComponent (Koltuk veya Vagon) ile bağladığın an iş biter. Unreal’ın kendi fizik ve transform motoru tren hareket edince içindekiler de onunla gider. mantığını otomatik ve en optimize şekilde arka planda halleder.

Senin Tick fonksiyonu içinde her seferinde 'oyuncu şimdi şurada, vagon burada' diye SetLocation veya manuel güncelleme yapmana hiç gerek yok. Bu manuel hesaplamaları devreden çıkardığın anda sunucudaki o kasılma tamamen kaybolacaktır. Yani motorun kendi 'bağlama' (Attachment) sistemine güven, gerisini o halletsin.

Ayrıca illa locasyon lazom diyorsan ne fonksiyonu oluşturacaksın bilmiyorum ama oluşturacağın fonksiyon için Characterlerin locasyonu lazım dersende attach ettiğin her karakterin referansını alarak o referansdan güncel konumu veya rotasyonunu alırsın. Eğer işin içinde gezinme yoksa eğer gezinme varsa işin boyutu değişe bilir
1766046223972.png


Aslında sorun şu kodda. Ne var burada bilmiyorum ama direkt olarak 30 FPS götürüyor. Trenin lokasyonunu her oyuncuda güncelleyen bir değişken var. Oyuncuların lokasyonu değil de trenin lokasyonu herkes için güncelleniyor. Çünkü bu işlem TrainBP içinde gerçekleşiyor. Yani treni hareket ettiren yine trenin kendisi. Kendi kendini hareket ettiren kod.
Tüm lokasyon değişimleri hesaplanıp CurrentLocationa Set ediliyor ve bu değişken ise RepNotify olduğu için her oyuncuda değişen lokasyon belli oluyor. Curve kullandığımız için lokasyon FPS den bağımsız geçen zamana göre değişip ne olursa olsun kedin noktaya herkes için ulaşmış oluyor.

Notify içinde ise şu var :

1766046453878.png
 
Bence senin yöntem de aşırı pahalı leon, trenin hareketini "take recorder" veya sequencer ile animasyon haline getir, zoraki nin dediği gibi oyuncuları animasyon başlamadan önce trene attach la, hareket başlayınca tüm clientlara animasyonu oynat mesajı ilet bir kez yeter. Minimum hesaplama candır :)))
 
  • Beğen
Tepkiler: leonscottkfm
Yaptığın hata dan biri tick içerisinde "Replication" kullanman bu FPS ve veri akış canavarı demek.

Sorun: Sunucu, saniyede 60-120 kez tüm bağlı oyunculara "Trenin yeri değişti, yeni yerimiz bu!" diye paket gönderiyor.
Sonuç: Sunucu işlemcisi paket yetiştiremediği için oyun teklemeye başlar ve istemci tarafında (Client) her veri geldiğinde OnRep fonksiyonu tetiklendiği için FPS çakılır. ağ trafiği de çöker.

Tick doğrudan işleme giriyor. Hata Eğer Switch Has Authority yoksa, trenin hareket matematiğini hem sunucu hem de tüm istemciler aynı anda hesaplıyor.
Sonuç: Gereksiz bir CPU kullanımı doğuyor. Treni sunucu hareket ettirmeli, istemciler sadece izlemeli. Ama bu yapıda herkes "makinist" olmaya çalışıyor.Tick başına Switch Has Authority koyman lazım tavsiyem tickde replicated kullanma.

Hata: Aslında bütün olay burada bitiyor. Eğer bu trenin Replicated seçeneği açıksa, Switch Has Authority kullanarak BP sadece suncuda çalıştırman yeterli. Unreal zaten otomatik olarak lokasyonu eşitlemeye çalışır. Bir de OnRep ile elle Set Actor Location yaptığında, motorun kendi senkronizasyonu ile senin kodun çakışır (Jitter/Titreme oluşur).
 
Son düzenleme:
Bence senin yöntem de aşırı pahalı leon, trenin hareketini "take recorder" veya sequencer ile animasyon haline getir, zoraki nin dediği gibi oyuncuları animasyon başlamadan önce trene attach la, hareket başlayınca tüm clientlara animasyonu oynat mesajı ilet bir kez yeter. Minimum hesaplama candır :)))
Yapayım yapmasına da :D Herkeste eşit olacak mı? Tren durağa vardığında herkeste tam belirtilen noktada olmalı tren. Ne bir geri ne bir ileri.
Bu işlem şu haliyle çalışıyor beni aşırı yordu. Fakat sadece Server için sıkıntı çıkarıyor. FPS yok oluyor. Clientler için pek problem olmuyor.

Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 
@nonlinear haklı minimin hesaplama can. Artık movement sistemini nasıl yaparsın bilmiyorum. Hem suncuda hem istemcide çalıştırma şuna dikkat et. Actoru replicated et değişkenleri replicated etmene gerek yok çoğu işlevi suncuda yaptığın için ağ trafiği minimumda tut. Unreal kendi alt yapı motur bunu otomatik ve optimizasyonlu bir şekilde güncelleyecektir ayrıca bir bilgi vereyim. Switch Has Authority (RunOnServerCustumEvent) i dışına yetkilendirme yapıyorsun çünkü. Eğer sen sever isen bu kodu çalıştıra bilirsin değilsen çalıştırama gibi istemci ve sunucu yetkilendirmesi yapıyor bunu RunOnServer içerisinde kullanırsan rpc isteği gelmiş oluyor yetki zaten suncuda hem istemcide hemde sunucda çalışmış oluyor oyüzden hiç bir zaman RunOnServerComponent içerisin Switch Has Authority kullanma

Aslında bütün olay burada bitiyor. Eğer bu trenin Replicated seçeneği açıksa ve attach ettiğin zaman Switch Has Authority kullanarak BP sadece suncuda çalıştırman yeterli. Unreal zaten otomatik olarak lokasyonu eşitlemeye çalışır. Bir de OnRep ile elle Set Actor Location yaptığında, motorun kendi senkronizasyonu ile senin kodun çakışır (Jitter/Titreme oluşur). ayriyetten characterlerin locasyonunu güncellemene gerek yok bu sayede
 
  • Beğen
Tepkiler: leonscottkfm
herkes aynı anda insin istiyorsan onun da trick i şu, server herkese animasyonu oynat mesajı gönderdi, her client local olarak oynatıyor, ping farkından dolayı her client farklı zamanlarda bu animasyonu çalıştırdı ve küçük farklar oluştu (çok normal), sequencer kullanırsan eğer, animasyon başladıktan birkaç saniye sonra her clienttan server a event yolla yolladığın saati kaydet, "get game time seconds" olarak saati iste, serverdan sana mesaj döndüğünde kendi saatin ile server saatini karşılaştır, böylece senin server a yolladığın zaman server ın sana cevap verdiği zaman ve mesajın sana geri ulaştığı süre hepsi elinde olacak, logic olarak server dan sana mesajın gelme süresi asıl kriterin çünkü sequencer ı başlatan server, mesaj sana ulaştı sende başlattın asıl süre farkı buradan geliyor. küçük bir fade out/in UI hazırla, fade out yap sequencerın oynatma süresini server ile arandaki süre kadar ileri al, böylece animasyonlar eşitlenmiş olacak.

Ayrıca zorakinin dediği çok doğru şimdi koda bakıyorum event tick ile sen her clienttan server event gönderiyorsun, server tick event ler içinde bottle neck yiyor, event tick üzerinde has authority check atman lazım en kötü eğer dediğim yöntemi yapmayacaksan.

Tabii burada bir durum daha var, authority check yapıp bunu server event ile gönderirsen tren yalnızca server da hareket eder, server ın kendisine event göndermiş olursun, multicast olarak gönderip herkese server treni kontrol ediyor mesajı atman lazım. Repnotify bu durumda gereksiz kalıyor gibi geldi bana denemek lazım tabii.
 
Son düzenleme:
  • Beğen
Tepkiler: leonscottkfm
@nonlinear haklı minimin hesaplama can. Artık movement sistemini nasıl yaparsın bilmiyorum. Hem suncuda hem istemcide çalıştırma şuna dikkat et. Actoru replicated et değişkenleri replicated etmene gerek yok çoğu işlevi suncuda yaptığın için ağ trafiği minimumda tut. Unreal kendi alt yapı motur bunu otomatik ve optimizasyonlu bir şekilde güncelleyecektir ayrıca bir bilgi vereyim. Switch Has Authority (RunOnServerCustumEvent) i dışına yetkilendirme yapıyorsun çünkü. Eğer sen sever isen bu kodu çalıştıra bilirsin değilsen çalıştırama gibi istemci ve sunucu yetkilendirmesi yapıyor bunu RunOnServer içerisinde kullanırsan rpc isteği gelmiş oluyor yetki zaten suncuda hem istemcide hemde sunucda çalışmış oluyor oyüzden hiç bir zaman RunOnServerComponent içerisin Switch Has Authority kullanma

Aslında bütün olay burada bitiyor. Eğer bu trenin Replicated seçeneği açıksa ve attach ettiğin zaman Switch Has Authority kullanarak BP sadece suncuda çalıştırman yeterli. Unreal zaten otomatik olarak lokasyonu eşitlemeye çalışır. Bir de OnRep ile elle Set Actor Location yaptığında, motorun kendi senkronizasyonu ile senin kodun çakışır (Jitter/Titreme oluşur). ayriyetten characterlerin locasyonunu güncellemene gerek yok bu sayede
1766052609367.png


Sanırım şu yöntem ile olay çözüldü gibi. Sadece serverde çalışıyor bu. Oyunculara herhangi bir veri gitmiyor veya onlardan bir şey beklenmiyor. Event Tick içerisinde sadece trenin geçtiği süre kalan süre ve buna göre curve eğrisi alpha olup set location oluyor. Aşağıdaki RunTrainServer ise bir kere çalışıp başta değerleri belirliyor. Bunların hepsi Server Authority.
Burada eksik gördüğünüz bir şey var mı? RepNotify ise tamamen rafa kalkmış durumda. Trenin Root bölgesi hareket ediyor geri kalan her şey buna göre konumunu belirliyor zaten.
 
Bana çok fazla replicated değer var gibi gözüktü, tabii ki denemeden farazi olarak söylüyorum bunu ama dediğim gibi, bu kafayı hiç bozma kaldırmadan başka yerde herşeyi serverda local hesaplayıp multicast olarak location değerini gönderip set etsen. çünkü client ların ihtiyacı olan tek bilgi location bu durumda gerisini local tutmak mümkün gözüküyor bana.
 
GomyId varmı müsade edersen uzaktan bağlana bilirim değişkenleri replicated etme actoru bp'ni replicated yeterli unreal motrun alt yapısı bunu otomatik olarak güncelleyecektir. Zaten kodun suncuda çalışıyor ama actorun kendisini replicated etmeden mevcut konumu alamazssın. Busefer yine en başa dönüyorsun ilk kurduğun sistem

nonlinear deiği gibi herkes aynı anda insin istiyorsan onun da trick i şu, server herkese animasyonu oynat mesajı gönderdi, her client local olarak oynatıyor, ping farkından dolayı her client farklı zamanlarda bu animasyonu çalıştırdı ve küçük farklar oluştu (çok normal), sequencer kullanırsan eğer, animasyon başladıktan birkaç saniye sonra her clienttan server a event yolla yolladığın saati kaydet, "get game time seconds" olarak saati iste, serverdan sana mesaj döndüğünde kendi saatin ile server saatini karşılaştır, böylece senin server a yolladığın zaman server ın sana cevap verdiği zaman ve mesajın sana geri ulaştığı süre hepsi elinde olacak, logic olarak server dan sana mesajın gelme süresi asıl kriterin çünkü sequencer ı başlatan server, mesaj sana ulaştı sende başlattın asıl süre farkı buradan geliyor. küçük bir fade out/in UI hazırla, fade out yap sequencerın oynatma süresini server ile arandaki süre kadar ileri al, böylece animasyonlar eşitlenmiş olacak.​

​

​

Tavsiyem zaten suncuda çalıştırıyorsun kodunu burada en mantıklı ve en performanlı actoru replicated edeip. Oluşturduğun değikenlerin replicated'lerini kaldırman ve bütün yetkiyi suncuuya bırakıp unrealin altyapı motoruna bırakman lazım bu sistem daha performanli ve optimizasyonlu ve daha güvenli olacaktır senin için AAA kalitedeki oyunlar bu mantıkla yapılıyor. Elimizde hazır bir tool var bu motor onun için var. Bazı şeyleri motorun kendisine bırakmak performans,optimizasyon ve güvenirlilik için en mantıklı yol dur.​

 
Son düzenleme:
  • Beğen
Tepkiler: leonscottkfm
ok şimdi daha net anlaşıldı, gördüğüm kadarıyla hareket boyunca tarama yaptırıp hit var mı diye check ediyorsun ancak super pahalı bir yöntem, sana tavsiyem hareketin tam ortasında karakter forward vectore bağlı olarak açı sınırlı single check, yani bir anim notify oluşturup hareketin tam ortasında multisphere trace ile önünde kimler var bir kez check edeceksin, IsTarget ise damage yolla yoksa pas geç.

BP mantığıyla vurduğun/ateş ettiğin ve belirlediğin açı sınırları içinde mi bu şekilde kontrol edebilirsin. Minimum hesaplama candır ;)

Ekli dosyayı görüntüle 806
Trace sphere sweep yerine tek bir BoxTrace kullandım. Dediğin gibi minimum hesapla mnimum trace. Sunucuda varsayım olarak 100-150 karakterin aynı anda bu saldırıları yaptığını düşündüğümüzde, saniyede yüzlerce Trace hesaplanması sunucu işlemcisini ciddi oranda yoracaktır. Sunucuyu yormamak adına İstemci tarafında dediğin yöntemi kullanarak mesefa tabanlı oyuncu doğrulama gerçekleştireceğim ama collision mı yoksa yine trace mi ?
Bu alan 32-32-20 birim alanı kaplayacak. Istemci tarafında collisionu açık tutmak sürekli bir işlem yükü, Attack esnasında Collision'ı açıp kapatmak da ayrı bir yük diye tahmin ediyorum. Diğer aklımdaki ise istemci tarafında her attack tuşuna basıldığında büyük bir alana 1 trace attarak burada oyuncu varmı varsa sunucuda trace çizdirebilir (Hasar verebilir) Sunucuyu fazla yükten kurtarmam için aklıma gelen yöntem bunlar, bunların dışında yöntem varmı bilmiyorum.
Ekran görüntüsü 2025-12-19 101727.png

Bu şekilde yaptım fakat buda ağ trafiği artıra bilir. LeftMouse tick'de (CanServerTrace) değişkeni turu veya false olsada olmasada istemciden sunucuya veri gönderiyor. Veri tasarrufu için bunun yerine Attack animasyonun içerisine bu alanda oyuncu var mı ? kontrolü notify'eklesem animasyon başlangıcında oyuncu var mı ? kontrol eder varsa sunucuda trace çizdir yoksa çizdirmez her iki yöntemin bana avantajı ne olur. Networkde Notify sadece sunucuda çalışr bir bilgi okudum bana pek mantıklı gelmedi ama illaki bir veri akışı olması lazım (montage da dedicated tick de bulunuyor) . Eğer bu bilgi doğruysa benim açım dan Animasyon başlangıcında trace için notify eklemem daha mantıklı olacak. Tavsiyelerinizi ve önerilerinizi bekliyorum şimdiden teşekkürler.
 
Son düzenleme: