YuDe - Unity - DeltaTime

GAME, SOFTWARE, NETWORKING AND MORE...

Contact us for cooperation

 

Unity - DeltaTime

Merhabalar. Bu yazıda, kodlarda çok sık kullandığımız deltaTime ı ayrıntılı bir şekilde anlatmaya çalışacağım.

Delta Time Nedir?

Adından da anlaşılacağı üzere iki durum arasındaki zaman değişikliğidir. Gelelim bunun Unitydeki yerine.
Unitynin kendi dokümanlarına baktığımızda deltaTime için "time passed since last frame" yani "son kareden bu yana geçen zaman" açıklamasını görürüz. Bu bir nevi iki kare arasındaki zaman farkı anlamına gelmektedir. Bu demek oluyorki deltaTime değiştirilemez sadece okunabilir. Şöyle bir örnekle açıklayayım.
Play buttonuna bastık oyunu başlattık, çok az bir zaman geçiyor ve şuan 36.karenin görüntülendiğini görüyoruz. 37.Kareye tam geçtiğimizde deltaTime güncelleniyor, yeni değeri basit "(şimdiki zaman)-(36.kare ilk görüntülendiği zaman)" formülü hesaplanıp çıkan sonuç ile değişiyor.
Yani kısaca deltaTime iki kare arasındaki zaman farkı diyebiliriz. Eğer 1 i FPS ye bölersek Time.deltaTime ı buluruz. Örnek verecek olursak; FPS 40 ise bu durumda deltaTime 1/40=0.025 olur
(*)"deltaTime" ile "fixedDeltaTime" ı birbiri ile karıştırmamak gerekiyor. fixedDeltaTime adından da anlaşılacağı üzere değeri sabittir, FPS ye bağlı değişmez. Edit/ProjectSettings/Time daki "FixedTimestep" değerini alır her zaman. deltaTime ise iki kare arasında geçen zamana eşit olduğu için tamamen FPS ye bağlıdır ve değişkendir.

Ne Amaçla Kullanılır?

Bu fonksiyonun tek görevi; işlemlerinizi, FPS den yani gösterilen/gösterilecek kare sayısından bağımsız yapmanız içindir. Animasyon tabansız bir karakter kontrol scriptinde hız değişkenlerinizi Time.deltaTime ile çarpmazsanız; FPS düşük olunca karakter yavaş hareket edecek, yüksek olursa da karakter hızlı hareket edecektir. Bu özellikle Multiplayer bir oyunda adaletsizliklerin doğmasına neden olacaktır.
Sadece hız değişkenleri ile mi çarpılıyor bu deltaTime? Tabiki hayır, Zaman ile ilgili bir çok konuda kullanabilirsiniz. Örneğin kare başı çalışan bir tekrarlı fonksiyonda(Update gibi) bir float değere sürekli Time.deltaTime eklerseniz bu size saniye cinsinden artan bir sayaç verecektir.

Peki Ya Nasıl?

deltaTime'ın ne amaçla kullanıldığını bir çoğunuz biliyordunuz aslında, peki çalışma mantığını biliyor musunuz? FPS leri farklı iki cihazda karakterlerin yürüme hızlarını nasıl eşitliyor? Bunu en iyi şekilde aşağıdaki örneklerle açıklayabilirim.

Öncelikle Time.deltaTime kullanmadan bir objeyi çok basit bir şekilde hareket ettirelim.

 void Update()
 {
	  transform.Translate(10,0,0);
 }
 

Bu kodda, "scriptin bulunduğu objeyi +x yönünde her kare de 10 birim kaydır" dedik. Projeyi, biri 20 FPS de diğeri de 50 FPS de çalıştırıcak iki farklı cihaza derlediğimizi düşünelim.

Projeyi;
20 FPS de çalıştıran cihazda obje, kare başı 10 birim kayarsa saniyede 20*10=200 birim,
50 FPS de çalıştıran cihazda obje, kare başı 10 birim kayarsa saniyede 50*10=500 birim kayacak.

Gördüğünüz gibi ortada bir adaletizlik var. Düşük özellikli cihazda obje saniyede 200 birim kayacakken yüksek özellikli cihazda ise saniyede 500 birim kayacak. Tam 2.5 kat fark var!

Şimdi ise Time.deltaTime kullanarak hareket ettirelim objeyi.

 void Update()
 {
	  transform.Translate(10 * Time.deltaTime,0,0);
 }
 

Yine aynı şekilde projeyi, biri 20 FPS de diğeri de 50 FPS de çalıştırıcak iki farklı cihaza derlediğimizi düşünelim.

20 FPS veren cihazda:
Time.deltaTime = 1/20 = 0.05
Kodda deltaTime ı 10 ile çarptığımız için kare başı 10*(0.05) = 0.5 birim kayacak.
FPS 20 ise bu kod saniyede 20 defa çalışacak demektir. Yani 1 saniyede toplam (0.5)*20 = 10 birim kayacak bu obje.

50 FPS veren cihazda:
Time.deltaTime = 1/50 = 0.02
Kodda deltaTime ı 10 ile çarptığımız için kare başı 10*(0.02) = 0.2 birim kayacak.
FPS 50 ise bu kod saniyede 50 defa çalışacak demektir. Yani 1 saniyede toplam (0.2)*50 = 10 birim kayacak bu obje.


Gördüğünüz gibi FPS ler farklı olmasına rağmen aynı sürede aynı yolu katletti iki cihazdaki objeler. Son olarak Time.deltaTime ı hesaplarken neden 1 i FPS ye böldüğümüzü açıklıyayım.
FPS nin anlamının saniyede gösterilen kare sayısı olduğunu biliyorsunuz. 1 Saniyede X tane kare gösteriliyorsa, iki kare arasındaki zaman farkı 1/X ile bulunur. Bu ise deltaTime a eşit oluyor.
Ben olayı örneklediğim için bunu açıklama gereksiniminde bulundum, siz deltaTime kullanırken tabiki 1/FPS işlemini uygulamayacaksınız. Bunun yerine direk Time.deltaTime ı kullanacaksınız. Okuduğunuz için teşekkürler.