ClimbDown

Cezalı Üye
11 Tem 2015
1,147
-18
0
(53) Rize
Şu sıralar değişkenler ile çok yolum kesiştiğinden kafama bir soru takıldı.


Şimdi mesela biz bir alarmı bozuyoruz veya bozduk.

Bunları belirten bool değerlerini karakter bp de depoluyorum.

Mesela bir sonraki levelde bunları kullanmayacağım,bunların performansa etkisi nedir?

Bir sıkıntı yaratırmı?

Bunun yerine başka nasıl bir yöntem önerirsiniz (Level bp olmamak şartı ile)?


Ben a adında bir actor oluşturup (Küçük bir collisionu olucak[içinden geçilebilen,temas olmayan türden] ve karakter objesinin içine attach edilmiş olacak) karakter yerine bu değişkenleri a actorune depolamayı düşünüyüyorum (karakterin içinde olduğundan cast yaparken karaktere değil,a actorune cast yapacağız [cast olan obje ise karakter olacak])

Mantıklı bir hamle midir?,her level için farkı actorler oluşturmak (a gibi) mı yoksa karakterde depolamak mı?


Ne kadar değişken o kadar performans ve boyut demektir,bir levelde en fazla 4 karakter olucak.


Son olarak konu açmışken değişkenlerin performansa olan etkisini sorayım,yani 50000 tane değişkenli bir oyun ile 500 tane değişkenli bir oyun (koşul-sonuçlar dahil) arasındaki performans farkı ne kadardır?


​
 
SoloWarrior' Alıntı:
Şu sıralar değişkenler ile çok yolum kesiştiğinden kafama bir soru takıldı.


Şimdi mesela biz bir alarmı bozuyoruz veya bozduk.

Bunları belirten bool değerlerini karakter bp de depoluyorum.

Mesela bir sonraki levelde bunları kullanmayacağım,bunların performansa etkisi nedir?

Bir sıkıntı yaratırmı?

Bunun yerine başka nasıl bir yöntem önerirsiniz (Level bp olmamak şartı ile)?


Ben a adında bir actor oluşturup (Küçük bir collisionu olucak[içinden geçilebilen,temas olmayan türden] ve karakter objesinin içine attach edilmiş olacak) karakter yerine bu değişkenleri a actorune depolamayı düşünüyüyorum (karakterin içinde olduğundan cast yaparken karaktere değil,a actorune cast yapacağız [cast olan obje ise karakter olacak])

Mantıklı bir hamle midir?,her level için farkı actorler oluşturmak (a gibi) mı yoksa karakterde depolamak mı?


Ne kadar değişken o kadar performans ve boyut demektir,bir levelde en fazla 4 karakter olucak.


Son olarak konu açmışken değişkenlerin performansa olan etkisini sorayım,yani 50000 tane değişkenli bir oyun ile 500 tane değişkenli bir oyun (koşul-sonuçlar dahil) arasındaki performans farkı ne kadardır?


​

Mesela bu trigger özel bir takım işlemler yapıyorsa, sırf bu işi yapan, gerekli değişkenleri üzerinde tutan bir BP Class (adına MYTrigger diyelim) oluşturmak mantıklı bir hareket. Böylece zaten karmaşa içerisinde olan Character class sadeleşmiş olur. Bunun dışında level'a tek tek triggerlar koyup bunlarla collision durumunu denetlemek yerine, levela MyTrigger'lar eklemek ve geri kalan işleri bu triggerların kendiliğinden yapmasını sağlamak oldukça sade ve iyi bir programlama tekniği elde etmenizi sağlar.

Triggerlarda neden birden çok sayıda değişkeni tutmaya ihtiyacınız olduğunu anlamadım. Trigger durumunu denetlemek için 1 tane yeterli ama başka birşey yapıyorsanız bilemem.

Performans açısından 50000 tane değişken ve 500000 tane değişkenin sadece bulunmasının hiç bir farkı yoktur. 2 tür karmaşıklık vardır.
  • Yer Karmaşıklığı
  • Zaman Karmaşıklığı
Etken sadece değşken sayısının artması ise bu sadece yer karmaşıklığını arttırır. Yani 50000 boolean, 50000 * 1 byte ~= 48KB, 500000 boolean ise yaklaşık 450KB bellek kaplar. Bu hiçbir şey değildir. Bu boyut isterse bunun 5 MB olsun bu da hiçbir şey değil. Yer karmaşıklığını bu kadar dert edeceğiniz durum sunucu tabanlı, çok oyunculu, belki MMO tarzı oyunlar olabilir. Ancak onlarda da bir şekilde sunucularda çalışıp yüksek belleklere sahip olduğundan bu durumu kurtarır. Yani böylesi durumlarda kullanılan belleği dert etmenize çok gerek yok. Hele ki bahsettiğimiz değişken tipleri böyle 1-5-100 byte gibiyse. Bellek kullanımı, fiziksel bellek aşılmadığı sürece, performansı değiştirmez. Bir uygulama ister 100MB bellek kullansın isterse de 2GB bellek kullansın bunun performansa (oyunda fps'ye) hiç bir etkisi yoktur. Fiziksel belleği aşarsanız (diyelim ki 4 GB belleğiniz var ve oyun için 5GB gerekli) bu durumda işletim sistemi diski kullanarak sanal bellek oluşturacağından ve disklere okuma yazma hızı belleklere okuma yazma hızından çook düşük olduğundan, performans sorunları yaşamaya başlayabilirsiniz.

Değişken sayısının fps'ye (zaman karmaşıklığına) etkisi kurduğunuz algoritma ile ilgili değişebilir. Örneğin trigger her tetiklendiğinde bir diziye (Array) değerler ekliyorsanız, dizide biriken eleman sayısının performansa bir etkisi yoktur. Ama algoritmanızda mesela herhangi bir aktörün Tick'inde bu dizideki true ve false değerlerinin sayılarını, dizi dögü kullanarak dolaşıp hesaplıyorsanız işte o zaman hapı yuttunuz demektir. Eleman sayısı 10 katına çıktığında yapacağınız iterasyon sayısı da 10 katınca çıkacaktır. Bu algoritma da Tick gibi loop içerisinde çalışıyorsa işte performansınız burada büyük ihtimal düşecektir.

Kısacası kapladığınız alanı çok dert etmeyin, kullanacağınız algoritmayı, yapacağınız iş miktarını dert edin.
 
cahitburak' Alıntı:
SoloWarrior' Alıntı:
Şu sıralar değişkenler ile çok yolum kesiştiğinden kafama bir soru takıldı.


Şimdi mesela biz bir alarmı bozuyoruz veya bozduk.

Bunları belirten bool değerlerini karakter bp de depoluyorum.

Mesela bir sonraki levelde bunları kullanmayacağım,bunların performansa etkisi nedir?

Bir sıkıntı yaratırmı?

Bunun yerine başka nasıl bir yöntem önerirsiniz (Level bp olmamak şartı ile)?


Ben a adında bir actor oluşturup (Küçük bir collisionu olucak[içinden geçilebilen,temas olmayan türden] ve karakter objesinin içine attach edilmiş olacak) karakter yerine bu değişkenleri a actorune depolamayı düşünüyüyorum (karakterin içinde olduğundan cast yaparken karaktere değil,a actorune cast yapacağız [cast olan obje ise karakter olacak])

Mantıklı bir hamle midir?,her level için farkı actorler oluşturmak (a gibi) mı yoksa karakterde depolamak mı?


Ne kadar değişken o kadar performans ve boyut demektir,bir levelde en fazla 4 karakter olucak.


Son olarak konu açmışken değişkenlerin performansa olan etkisini sorayım,yani 50000 tane değişkenli bir oyun ile 500 tane değişkenli bir oyun (koşul-sonuçlar dahil) arasındaki performans farkı ne kadardır?


​

Mesela bu trigger özel bir takım işlemler yapıyorsa, sırf bu işi yapan, gerekli değişkenleri üzerinde tutan bir BP Class (adına MYTrigger diyelim) oluşturmak mantıklı bir hareket. Böylece zaten karmaşa içerisinde olan Character class sadeleşmiş olur. Bunun dışında level'a tek tek triggerlar koyup bunlarla collision durumunu denetlemek yerine, levela MyTrigger'lar eklemek ve geri kalan işleri bu triggerların kendiliğinden yapmasını sağlamak oldukça sade ve iyi bir programlama tekniği elde etmenizi sağlar.

Triggerlarda neden birden çok sayıda değişkeni tutmaya ihtiyacınız olduğunu anlamadım. Trigger durumunu denetlemek için 1 tane yeterli ama başka birşey yapıyorsanız bilemem.

Performans açısından 50000 tane değişken ve 500000 tane değişkenin sadece bulunmasının hiç bir farkı yoktur. 2 tür karmaşıklık vardır.
  • Yer Karmaşıklığı
  • Zaman Karmaşıklığı
Etken sadece değşken sayısının artması ise bu sadece yer karmaşıklığını arttırır. Yani 50000 boolean, 50000 * 1 byte ~= 48KB, 500000 boolean ise yaklaşık 450KB bellek kaplar. Bu hiçbir şey değildir. Bu boyut isterse bunun 5 MB olsun bu da hiçbir şey değil. Yer karmaşıklığını bu kadar dert edeceğiniz durum sunucu tabanlı, çok oyunculu, belki MMO tarzı oyunlar olabilir. Ancak onlarda da bir şekilde sunucularda çalışıp yüksek belleklere sahip olduğundan bu durumu kurtarır. Yani böylesi durumlarda kullanılan belleği dert etmenize çok gerek yok. Hele ki bahsettiğimiz değişken tipleri böyle 1-5-100 byte gibiyse. Bellek kullanımı, fiziksel bellek aşılmadığı sürece, performansı değiştirmez. Bir uygulama ister 100MB bellek kullansın isterse de 2GB bellek kullansın bunun performansa (oyunda fps'ye) hiç bir etkisi yoktur. Fiziksel belleği aşarsanız (diyelim ki 4 GB belleğiniz var ve oyun için 5GB gerekli) bu durumda işletim sistemi diski kullanarak sanal bellek oluşturacağından ve disklere okuma yazma hızı belleklere okuma yazma hızından çook düşük olduğundan, performans sorunları yaşamaya başlayabilirsiniz.

Değişken sayısının fps'ye (zaman karmaşıklığına) etkisi kurduğunuz algoritma ile ilgili değişebilir. Örneğin trigger her tetiklendiğinde bir diziye (Array) değerler ekliyorsanız, dizide biriken eleman sayısının performansa bir etkisi yoktur. Ama algoritmanızda mesela herhangi bir aktörün Tick'inde bu dizideki true ve false değerlerinin sayılarını, dizi dögü kullanarak dolaşıp hesaplıyorsanız işte o zaman hapı yuttunuz demektir. Eleman sayısı 10 katına çıktığında yapacağınız iterasyon sayısı da 10 katınca çıkacaktır. Bu algoritma da Tick gibi loop içerisinde çalışıyorsa işte performansınız burada büyük ihtimal düşecektir.

Kısacası kapladığınız alanı çok dert etmeyin, kullanacağınız algoritmayı, yapacağınız iş miktarını dert edin.

Yorumun ve emeğin için sağol.

Seninde dediğin gibi,karakterin sade olmasını istiyorum.


Olay trigger değil,level bilgilerini actor bp lerde kullanabilmek.

Event tick kullanmıyorum,onun yerine 100ms gibi zaman aralıkları kullanıyorum.


Mesela şunu sorayım,her 2 saniyede bir a actorune cast ettirip,ordan gelen veri ile bir koşul node si oluştrup denetletmek nasıl bir performans harcar?

Günümüz bilgisayarları çok güçlü,bunları dert etmeye gerek yok fakat insan merak ediyor :)
 
SoloWarrior' Alıntı:
Mesela şunu sorayım,her 2 saniyede bir a actorune cast ettirip,ordan gelen veri ile bir koşul node si oluştrup denetletmek nasıl bir performans harcar?

Günümüz bilgisayarları çok güçlü,bunları dert etmeye gerek yok fakat insan merak ediyor :)

Bu işlem tek bir işlem ise hiç dert edilmez, dizideki n tane elemanı denetleyecekseniz zaman karmaşıklığınız O(n)'dir. Yani her biri x kadar sürerse n.x kadar zaman alacaktır. X çok küçük bir değer bile olsa n sayısına bağlı olarak (eleman sayısı) bu işlem uzun sürecektir.  İster bu işlemi her framede isterseniz 2 saniyede 1 yapın, n sayısı arttıkça FPS düşüşü görürsünüz. Birinde her frame FPS düşük olur diğerinde 2 saniyede bir FPS düşüşü olur. Bu istenmez. Ama büyük ihtimalle zaten yanlış/gereksiz bir iş yapıyorsunuz demektir. Dizide iterasyon yapmadan da bunu çözebilmenin yollarına bakın.

Tamam tamam, ben ille de eminim bunun başka yolu yok diyorsanız, neyse ki Unreal bir çok şeyi düşünmüş ve size multithreading yapmadan, zaten varsayılan bir çok thread tanımlamış. Bu işlemi ana thread dışında çalıştırırsanız, hiç bir sorun çıkmayacaktır. Bunun için multithreading nasıl yapılır bilmenize gerek yok ama neresi ana thread dışında çalışır bilmelisiniz. Yani işlemi nerde yapacağınız önemli.
 
cahitburak' Alıntı:
SoloWarrior' Alıntı:
Mesela şunu sorayım,her 2 saniyede bir a actorune cast ettirip,ordan gelen veri ile bir koşul node si oluştrup denetletmek nasıl bir performans harcar?

Günümüz bilgisayarları çok güçlü,bunları dert etmeye gerek yok fakat insan merak ediyor :)

Bu işlem tek bir işlem ise hiç dert edilmez, dizideki n tane elemanı denetleyecekseniz zaman karmaşıklığınız O(n)'dir. Yani her biri x kadar sürerse n.x kadar zaman alacaktır. X çok küçük bir değer bile olsa n sayısına bağlı olarak (eleman sayısı) bu işlem uzun sürecektir.  İster bu işlemi her framede isterseniz 2 saniyede 1 yapın, n sayısı arttıkça FPS düşüşü görürsünüz. Birinde her frame FPS düşük olur diğerinde 2 saniyede bir FPS düşüşü olur. Bu istenmez. Ama büyük ihtimalle zaten yanlış/gereksiz bir iş yapıyorsunuz demektir. Dizide iterasyon yapmadan da bunu çözebilmenin yollarına bakın.

Tamam tamam, ben ille de eminim bunun başka yolu yok diyorsanız, neyse ki Unreal bir çok şeyi düşünmüş ve size multithreading yapmadan, zaten varsayılan bir çok thread tanımlamış. Bu işlemi ana thread dışında çalıştırırsanız, hiç bir sorun çıkmayacaktır. Bunun için multithreading nasıl yapılır bilmenize gerek yok ama neresi ana thread dışında çalışır bilmelisiniz. Yani işlemi nerde yapacağınız önemli.
Neresi onun dışında yapılır?

Bu arada 2 saniyede 1 tanee şeyi kontrol ediyor ve o değişken bool

0 yada 1 anlayacağınız.

Başka yolu yok :)
 
SoloWarrior' Alıntı:
Neresi onun dışında yapılır?

Bu arada 2 saniyede 1 tanee şeyi kontrol ediyor ve o değişken bool

0 yada 1 anlayacağınız.

Başka yolu yok :)

Mesela AI Task'lar varsayılan olarak farklı threadlerde çalışır. Yapay zeka da kullanılan en basit işlemlerden birisi yapay zekanın kendisine en yakın Actor'ü bulma algoritması. Bunun için World'deki tüm aktörler (belki bir filtreden geçirilip) ile yapay zeka arasındaki mesafeler kontrol edilir ve en küçük olan seçilir. Birden çok yapay zeka olduğunu düşünürsek oldukça fazla iş yükü demek (100 yapay zeka 100 Actor ile mesafe denetimi yapıyor, bu en basitinden 10 bin iterasyon demek). Task olarak yazdığınız kod yada Graph ayrı bir thread'de çalışır. Bu çok ayrıntılı bir konu ve bir çoğunu ben de tam bilmiyorum.

Tek bir boolean değeri kontrol ediyorsanız Tick'de de kontrol edebilirsiniz, hiç dert etmeyin belki de bu yapılabilecek en kısa iş.

Bu arada gereksiz bir bilgi: Normalde boolean değerler true yada false olarak görünse de belleğe 1 byte'tan küçük değerler yazılamadığından 1byte yani 8 bit büyüklüğündedir (0 veya 1, 1 bittir). Unreal'ın güzelliklerinden birisi boolean değerleri birbiri içerisinde paketleyebilmesi. Yani unrealda boolean 1 byte yer tutuyor ama tanımlarken ardı ardına 8 tane bool tanımlarsanız (C++'da uint8 : 1) hepsi toplam 1 byte tutuyor. E bellek önemli değil dedik, buna ne gerek var? Evet bu veri kümesi Online bir aksiyon oyununda saniyede 20 kez her bir client'e gönderiliyorsa, paket boyutlarının düşmesinde çok büyük önem arz edebilir. Hem net kullanımı ve bant genişliği hem de network performansı ve LAG problemlerini etkiler.