Oyun Döngüsü: Delta Time ile Hızdan Bağımsız Hareket
Oyun döngüsü her bilgisayarda farklı hızda çalışır. Birinin bilgisayarı saniyede 60 kare gösterirse, diğerinin 120 kare gösterebilir. Eğer hareketleri kare sayısına bağlı yaparsanız, hızlı bilgisayarlarda karakterler daha hızlı hareket eder.
Delta time (Δt) bunu çözer: Son karenin ne kadar süre önce çizildiğini ölçer ve hareketi buna göre ayarlar.
Önceki karenin zamanını tutun. Şimdiki zaman eksi önceki zaman = delta time.
1var lastTime = Date.now();2var deltaTime = 0;34function gameLoop() {5var currentTime = Date.now();6deltaTime = (currentTime - lastTime) / 1000; // saniye cinsine çevir7lastTime = currentTime;89update(deltaTime);10render();11requestAnimationFrame(gameLoop);12}Karakter hızını (birim/saniye) delta time ile çarparsanız, her karede doğru mesafe kaydırılır.
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1var playerX = 0;2var playerSpeed = 100; // piksel/saniye34function update(deltaTime) {5if (keysPressed['ArrowRight']) {6playerX += playerSpeed * deltaTime;7}8if (keysPressed['ArrowLeft']) {9playerX -= playerSpeed * deltaTime;10}11}1var player = { x: 0, y: 100, speed: 200 }; // 200 piksel/saniye2var lastTime = Date.now();3var keysPressed = {};45window.addEventListener('keydown', (e) => keysPressed[e.key] = true);6window.addEventListener('keyup', (e) => keysPressed[e.key] = false);78function gameLoop() {9var currentTime = Date.now();10var deltaTime = (currentTime - lastTime) / 1000;11lastTime = currentTime;1213// Güncelle14if (keysPressed['ArrowRight']) player.x += player.speed * deltaTime;15if (keysPressed['ArrowLeft']) player.x -= player.speed * deltaTime;1617// Çiz18var canvas = document.querySelector('canvas');19var ctx = canvas.getContext('2d');20ctx.clearRect(0, 0, canvas.width, canvas.height);21ctx.fillStyle = 'blue';22ctx.fillRect(player.x, player.y, 40, 40);2324requestAnimationFrame(gameLoop);25}2627gameLoop();Çıktı: Sağ-sol tuşlarıyla kare hızı ne olursa olsun karakter sabit hızda hareket eder.
Delta time = şimdiki zaman − önceki zaman. Hareketi hız × deltaTime formülüyle hesaplayın. Böylece tüm bilgisayarlarda aynı hız sağlanır.
5 yorum
Çok güzel anlatılmış, delta time tam da bu yüzden gerekli. Hız tuşunda çalışırken delta time'ı unutup karede sabit birim kaydırsam, yüksek fps'de karakter uçar gider.
Bu şekilde 60 fps'de de 144 fps'de de karakter saniyede 100 birim hareket eder, bilgisayar hızına fark etmez.
Aynen bu farkı ilk başta fark etmediğimde oyunumda karakterler monitör yenilenme hızına göre değişik hızlarda koşuyordu Delta time ekledikten sonra her yerde aynı davranıyor o kadar güzel bir çözüm
Evet, başta anlamayınca gerçekten garip oluyor. Ben de aynı şeyi yaşadım, 60 fps'de test ettikten sonra arkadaşın 144 fps'de oynadığında karakterin çok hızlı koştuğunu görmek biraz şok olmuş. Delta time ekledikten sonra herkes aynı deneyimi yaşıyor, o da işin güzel tarafı.
Gerçekten bu kadar basit, zamanı tutup çarpma işlemiyle her karenin süresi kadar hareket ettiriyorsun.
hee bence delta timeı kodda görünce first sanıyorsun ya abi ama işte o kadar değil gerçekten ben de bir sefer oyunumu 60 fpsde bitirip arkadaşa vermiştim çok kare atıyor diye kızıyo sonra anlattım farkı sonra da kendi oyununda eklemesi lazımdı şu şekilde düşün ya karenin süresi değişse de saniye hep 1 saniye delta timela her karede doğru orantı yaptığın için uçmazlar karakterler
görmüşsün vardır requestAnimationFramein zamanlaması monitörün hızına göre değişir delta time işte o sapkınlığı düzeltiyo sonuç olarak
Aynen, arkadaşın oyunu hızlı bilgisayarda test etmek gerçekten can sıkıcı. Bir kere delta time'ı ekledikten sonra o sorun ortadan kalkıyor ama ilk başta fark etmemek çok normal.