omer.hatay

Üye
2 May 2019
182
14
18
26
(34) İstanbul Avrupa
Seri atış yapmak için bir timer kurup ateş ettiğimde mermiler arasındaki mesafelerin eşit olmadığını fark ettim. Çok çok uzun bir süre önce farketmiştim ama artık çözmem gerektiğini düşündüm. Özellikle atış hızı arttıkça bu daha da belirgin hale geliyor. 
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 bu video zaten gösterdim. Envanterden ekipmana aktardığım eşyaları tekrar tekrar yaratmıyorum orda bir yanlış anlaşılma olmasın. Zaten atış sıklığı değişiyor. Her eşyada atış hızını 10 artırıyorum. 10 eşyayı ekledikten sonra saniyede 100 kere ateş eden bir silahım oluyor. Nasıl bu atış sıklığını optimize edebilir ve aralıklarını eşitleyebilirim?
 
Burada benim önemliden önemsize doğru söyleyebileceğim bir kaç şey var.
 1. Hiç kimse oyunu durduramayacak ve oyunun daha başlarındasın. Bu aşamada böyle şeylere takılmak bence doğru değil. Eğer gerçekten önemli ise "polish" safhasında düşünülebilecek bir şey.
 2. Yargılarını göz kararı veriyorsun. Göz kararı yanıltıcı olabilir. Eğer aradaki zamanlamayı merak ediyorsan, tam olarak "call shooted" node unun yanına bir print string koymalısın. Ayrıca settings ten log larda timecode u da etkinleştirmelisin. Bunun haricinde FireRate vb. değişkenleride log lamalısın. Böylece tam olarak ne değişiyor, ne kadar değişiyor etc. herşeyi görebilirsin. Belki hiç beklemediğin bir yerde bir hata vardır ama sen fark etmiyorsundur. Örneğin FireRate in beklemediğin bir yerden yanlış geliyorsa bunu loglardan direk görebilirsin. Aradaki mesafeleri ölçmek istiyorsan measurement tool var.
 3. Tick in DeltaTime ının altına düştüğünde artık zamanlama mükemmel çalışamaz. Mesela Tick DeltaTime 0.02 ise ancak sen her 0.01 saniyede bir şey yaptırmak istiyorsan engine loop süresinin altına düşeceğin için istediğin bir seviye mükemmellik olmaz. Bunu WaitNextTick miyde WaitOneTick miydi öyle bir node vardı. Onunla aşabilirsin ama bu kadar hızlıda gerek olmaması lazım. Bunları bir önceki madde de belirttiğim gibi incelemelisin.
 4. Call Shooted fonksiyonun ne yapıyor acaba. Bir şey spawn etmediğine emin misin? Problem ordan da kaynaklanıyor olabilir.

Genel olarak BP debugging yapmalısın FireRate in herhangi bir sebeple değişik değerler bile alıyor olabilir.
 
GmpOn.png

log olarak yazdırdığımda ilk değerin değişkenliği her şeyi açıklıyor. İlk yazan mermilerin birbirleri arasındaki süre farkları. Tire işaretinden sonra yazan ise 1 bölü firerate. Saniyede 42 kez ateş ediyor silah ve bence bu hiçbir şey. Zaten sistemim çok iyi. Diğer türlü firerate değiştiği zaman zaten atış hızını ben güncelliyorum. Kendi kendine timer ı silip güncelleme gibi bir durum yok. Bu hep böyleydi, kaç proje yaptım birkaç farklı bilgisayarda denedim hep böyle.
 
@erginegider'in de bahsettiği gibi, sn'de 100 kere ateş etirmek demek sürekli olarak 100+ fps alıyor olmanı gerektirir bu yüzden fps değerlerini de kontrol etmelisin. Aynı zamanda  Call Shooted'ı görmemiz gerekli. Ateş ettiğin objeler projectile + collision'ı kapalı box mu? Mermiler birbirinin collision'ını ignore ediyor mu?
 
Timestamp şöyle açılır : Editor preferences -> Output log -> Outputlog Window Timestamp mode . Bunu utc ya da local yapabilirsin. Bu sana her logun zamanlamasını yanına verecek. Jacky nin dediği gibi o fonksiyonda ne oluyor bilmiyoruz. Orada collision dan dolayı bir yer değiştirme oluyor olabilir. Başka şeyler de olabilir. Buna şöyle yaklaşabilirsin. O fonksiyondan bağımsız olarak zamanlamada sıkıntı varmı. İstediğin fonksiyonun yerine print string koy ve loglardan gerçek zaman aralıklarına bak. Eğer herşey Ok gözüküyorsa o fonksiyon içindeki şeylere odaklanmalısın. Yok zamanlamada yine hata varsa yukarı da da bahsetttiğim gibi FPS n o kadar iyi olmayabilir ve MS olarak çok altta kalıyor olabilirsin. Blueprint kullanmanın da bir bedeli var. Aradaki küçük ms farkları Blueprint ekstra yükünden kaynaklanıyor da olabilir.
 
Hocam call shooted sadece dışarıya atış yapıldığını haber veriyor. Silahı dinleyen ve atış sayısına göre ekstra atış yaptıran bir skill var onun için. Bu Weapondan türeyen başka bir actor shoot fonksiyonunu override ediyor ve 
GTziM.png

bunları çalıştırıyor. Diğer türlü Merminin object type i resimde de gösterildiği gibi player bullet olarak seçiliyor ve oyuncunun içindeki her hangi bir nesne ile etkileşime girmiyor. Ki Weapon hiçbir şey yaptırmayıp sadece zamanı ekrana yazdırsa yine 
GT2GQ.png

böyle bir sonuç ortaya çıkıyor. Ben bu kodların aynısı c++ ta da yazdım, orda da aynı sorun vardı.
 
Yukarıdaki tüm cevaplar aynen geçerli. Zaman aralığın çok düşük. Sen yine de tam olarak neyin zamanı değiştirdiğini öğrenmek istiyorsan Unreal Insights öğrenmen gerekecek. Orada kaybolan ms. lar nereye gidiyor o anda arka planda neler oluyor görebilirsin.