Herkese merhabalar.
Yavaş yavaş yeni bir projeye başlıyorum sonunda. Bundan sonra yapacağım tüm oyunlar multiplayer olacak. Modüler bir sistem kuruyorum.
Şimdilk Client-Server modeline odaklıyım ve bu şu demek. Bir oyuncu hem server hem client bir arada olacak. Yani hem kendi oyununu oynayacak hem de diğer oyuncuların senkronize olması gereken şeylerini de kendisi yapacak. Bu kurucu oyuncunun bilgisayarında ekstra yük oluşturuyor tabi bu sadece game thread üstünde oluyor ki en az sıkıntı yaşanan thread.
Yine de daha en başından hangi işlemlerin ne kadarını clientte ne kadarını serverde yapacağımı düşünüyorum. Ne kadar loop, trace, casting yapabiliyor performans etkilenmeden bir istemci merak ettim ve boş bir projede şu testleri yaptım ve işlemin kaç milisaniyede tamamlandığını hesaplattım:
Tüm testler Blueprint içinde yapıldı. C++ da daha hızlı olacaktır.
500 Aktör spawn etmek(Boş) =1ms;
500 Aktör spawn etmek(2-3 komponent ve igrone collision parametresi ile) = 30ms;
5000 aktör ile GetAllActorsOfClass(Actor)->CastTo(TestActor)->bir integer matematik işlemi = 0.1ms(Casting sandığımdan daha az performansı etkiliyormuş.)
5000 aktör ile (GetAllActorsOfClass(Actor)->CastTo(TestActor)->GetComponentByClasss(BirKomponent)->IsValid->Komponent içindeki bir fonksiyon) = 5ms;
5000 aktör ile AddComponentByClass = 0.1ms; (Component ekleme silme de çok az performans yiyor)
10000 LineTraceByChannel(2500 trace mesafesi) = 3ms;
10000 MultiLineTraceByChannel (2500 trace mesafesi) = 10ms;
5000 MultiSphereTraceByChannel(2500 trace mesafesi, 150 radius) = 30ms;
İşlemci AMD 5600 xt. Multispheratrace ve colision olan 500 aktörü her tickte yapılması dışında hiçbir fps kaybı yaşamadım.
Sonuçlar beklediğimden çok daha iyi. Hiçbir oyunumda bir tickte 100 den fazla trace bile yapacağımı sanmıyorum.
Yavaş yavaş yeni bir projeye başlıyorum sonunda. Bundan sonra yapacağım tüm oyunlar multiplayer olacak. Modüler bir sistem kuruyorum.
Şimdilk Client-Server modeline odaklıyım ve bu şu demek. Bir oyuncu hem server hem client bir arada olacak. Yani hem kendi oyununu oynayacak hem de diğer oyuncuların senkronize olması gereken şeylerini de kendisi yapacak. Bu kurucu oyuncunun bilgisayarında ekstra yük oluşturuyor tabi bu sadece game thread üstünde oluyor ki en az sıkıntı yaşanan thread.
Yine de daha en başından hangi işlemlerin ne kadarını clientte ne kadarını serverde yapacağımı düşünüyorum. Ne kadar loop, trace, casting yapabiliyor performans etkilenmeden bir istemci merak ettim ve boş bir projede şu testleri yaptım ve işlemin kaç milisaniyede tamamlandığını hesaplattım:
Tüm testler Blueprint içinde yapıldı. C++ da daha hızlı olacaktır.
500 Aktör spawn etmek(Boş) =1ms;
500 Aktör spawn etmek(2-3 komponent ve igrone collision parametresi ile) = 30ms;
5000 aktör ile GetAllActorsOfClass(Actor)->CastTo(TestActor)->bir integer matematik işlemi = 0.1ms(Casting sandığımdan daha az performansı etkiliyormuş.)
5000 aktör ile (GetAllActorsOfClass(Actor)->CastTo(TestActor)->GetComponentByClasss(BirKomponent)->IsValid->Komponent içindeki bir fonksiyon) = 5ms;
5000 aktör ile AddComponentByClass = 0.1ms; (Component ekleme silme de çok az performans yiyor)
10000 LineTraceByChannel(2500 trace mesafesi) = 3ms;
10000 MultiLineTraceByChannel (2500 trace mesafesi) = 10ms;
5000 MultiSphereTraceByChannel(2500 trace mesafesi, 150 radius) = 30ms;
İşlemci AMD 5600 xt. Multispheratrace ve colision olan 500 aktörü her tickte yapılması dışında hiçbir fps kaybı yaşamadım.
Sonuçlar beklediğimden çok daha iyi. Hiçbir oyunumda bir tickte 100 den fazla trace bile yapacağımı sanmıyorum.