2016-03-28 30 views
-3

Merhaba Kullanmaya çalıştığım bu w3school kod var. Ancak, bu örnekte setInterval neden sadece 5 ve 5000 değil anlamıyorum. Binlerce olması gerekmez miydi? Ve değilse, o zaman bu animasyonu daha hızlı nasıl yapabilirim? Çünkü, her zaman ondalıklara indirgeyim (0.01 gibi) animasyon neredeyse şimdiki zamanla aynı miktarda zaman alıyor! peşinSetInterval neden milisaniye cinsinden değil?

http://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_animate_3

teşekkürler! Kırmızı kare her saniye birden piksel taşımak istedikleri için

+4

5ms. Neden 5'ler olsun? –

+1

Eğer '5000' için ayarlarsanız ne olacağını düşünüyorsunuz? Bunu deneyebilirsin, biliyor musun? – Xufox

+2

'5ms' yaklaşık 200 fps'dir. Neden daha hızlı gitmesini bekliyorsun? Pürüzsüz animasyonlar için 'requestAnimationFrame' ve delta zamanlaması kullanıyor olmalısınız ... –

cevap

0

Bir acemi soru, ama değil aptal bir soru; Üzgünüm, yukarıda böyle iğrenç yorumlar yapıyorsun. Bu örnekteki setInterval aralığı tanımlar sadece 5 değil 5000

neden

anlamıyorum ne kadar zaman kodu tekrar çalıştırmadan önce bekleyeceği milisaniye cinsinden - 5000 milisaniyelik bir aralık olur Her beş saniyede bir hareket etmesine sebep olur. 5'lik bir aralık, her 5 saniyede bir ya da saniyede 200 kez (teorik olarak) çalışmasına neden olur. Ama artık

yaptığı gibi animasyon neredeyse ... Her çalışma geçer dahilinde işlem süresi aynı süreyi alır ... aşağıda

Ben ondalık için aşağı düşürmek her zaman görebilirsiniz dikkate alınmaz; setInterval sadece geçişler arasındaki gecikme miktarını kontrol eder. Bu yüzden burada sahip olduğunuz çok küçük bir aralık muhtemelen her koşuyu yapmak için harcanan zamana göre boğulmuş olacak; Belirli bir noktanın altında (kullanıcının işlemci hızına bağlı olacaktır) daha kısa aralıklar kodunuzun daha hızlı çalışmasına neden olmaz.

Animasyonun daha hızlı çalışmasını istiyorsanız, daha fazla döngüyü çalıştırmaya çalışmak yerine, nesneyi döngü başına daha fazla taşımanız gerekir. - yerine döngü başına madde 1 piksel hareket nedeniyle, hızını iki katına o döngü başına 2 piksel hareket edeceğiz

function frame() { 
    if (pos > 349) { // <-- here 
     clearInterval(id); 
    } else { 
     pos = pos + 2; // <-- and here 
     elem.style.top = pos + 'px'; 
     elem.style.left = pos + 'px'; 
    } 
    } 

ikinci değişiklik yeterince açıktır: kodunuzu iki değişiklik iyiyerin gerektirir.

birincisi sonsuz döngüler önlenmesidir: Eğer pos daha büyük artışlar ekliyoruz beri yerine pos büyüktür 349.

olup olmadığını görmek için kontrol ederek potansiyel sonsuz döngüler kaçınmak gerekir bu yüzden, sağ geçmiş 350 atlamak olabilir
+0

_Sürüm, kodun tekrar çalışmaya başlamadan önce ne kadar süre bekleyeceğini tanımlar. Yeniden çalıştırmayı denemeden önce onu değiştiririm. JavaScript tek iş parçacıklı olduğundan ve iş parçacığı meşgulse kod çalıştırılamıyor. – Lends

+0

İnanılmaz :) Teşekkürler bir ton! –

0

setInterval() çağrısı sadece 5'tir. Karenin ne kadar hızlı hareket ettiğini görmek için setInterval çağrısındaki değerle 1000 (bir saniye) ayırın. 1000/5 = saniyede 200 piksel hareket.

bazı başka numaraya setInterval() değerini değiştirirseniz, sağdaki animasyon olarak önce üst orta kısmındaki "Sonuç Bkz >>" butonuna tıklayın sürece aynı hızda çalışır. Değiştirilen kodunuzu sol taraftan sağ tarafa kopyalar.

İlgili konular