Bu koddaki “delta” nın anlamı nedir? Oyundaki standart bir şeyi yansıtıyor mu?


24

Oyun programlaması hakkında çok az şey biliyorum ama daha fazla bilgi edinmek istiyorum. Bu oyunun kodunu anlamaya çalışıyorum . Kodun neden kullanıcı girişine göre geminin yönünü değiştiren Shipcontrols.js'ye "delta" ilettiğini anlamaya çalışıyorum.

Temelde oyun her döngü "delta" hesaplar ...

İşte bir döngüden delta kullanan yığının kısaltılmış bir versiyonu ...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

Buraya adım atmak ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

Buraya adım atmak ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

Hangi şeyleri böyle yapar ...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

ve bu...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

Buradaki deltanın amacı nedir? Sadece rastgele bir unsur sunmaya mı çalışıyor? Bu oyunun kodu çok iyi. Bu adam neden delta kullandı?


2
“Rastgele bir unsur sunmaya mı çalışıyor?” Aslında bunun tam tersi doğrudur, buradaki deltanın amacı rastlantısallığı azaltmak ve oyun motorundaki fiziği normalleştirmek.
zzzzBov

Yanıtlar:


27

Bu "zaman deltası" dır. Önceki güncellemeden bu yana ne kadar zaman geçti. Animasyonların, fiziğin ve benzerlerinin doğru hızda çalışmasını sağlamak gerekir.

Kod her kare güncellemesi için bir kez çalışıyor. Ancak, çerçevelerin sabit bir hızda çizilmesi garanti edilemez. Bir kare saniyenin 1 / 60'ını alabilir, sonraki kare 1 / 30'unu alabilir. Bunu ölçmezseniz ve hesaba katmazsanız, oyun coşkulu olacak ve çeşitli durumlarda çok hızlı veya çok yavaş çalışacaktır.

Zaman deltaları çoğu zaman fizikte uygulanır, çünkü denklemler basit Euler entegrasyonları için bu şekilde belirtilir. Hızı, pozisyona entegre x1 = x0 + v * (t1 - t0)etmek, kodlama gibi basitleştirici olarak tanımlanır x += v * dt. Bu nedenle, fizik güncellemelerini değerlendirmek için zaman deltaları gerekir.

Zaman deltasının ölçülmesi ve uygulanması çok çok normaldir.


Bunun en iyi cevap olduğunu düşünüyorum çünkü 'dt' ifadesinin çok değişkenlik gösterebileceğini açıklıyor, bu yüzden fizik hesaplamalarını buna dahil etmemiz gerekiyor.
BiAiB

Bazı bağlamlarda zaman deltası ile ilgili büyük bir sorunun, birçok durumda bir çerçeveye göre "kapalı" olacağına dikkat etmek faydalı olabilir. Bir şey bir kare güncellemesinin normalin iki katı sürmesine neden olursa, o karenin eylemlerini hesaplarken uygulanan delta normal olur; kare nesnelerin iki katı kadar hareket ettirilmesi gerektiği zamana kadar gösterilmese de yaptıkları gibi. Bu çerçeve ile bir sonraki arasındaki süre normalden daha küçükse (zamanlayıcı "yakalamaya çalışırsa" oluşabilir, aralarında normalden daha az zamana sahip iki çerçeve ...
20'li

... nesnenin konumları arasında normalden daha büyük bir mesafe bulunur).
supercat

@supercat: Bu sadece her zamanki Fix Your Timestep şeyler. Yine de, sabit bir simülasyonun ne zaman basılacağını bilmek için kare başına zaman aralıklarına ihtiyacınız var.
Sean Middleditch

@SeanMiddleditch: Atari 2600 için oyun kodlayan birisi olarak, bazı sistemlerde, oyuncuların bir denetleyiciyi hareket ettirdiği zaman ve karakter cevap verdiği zaman arasında kaçınılmaz bir gecikme olduğu gerçeğini kimsenin suçlamadığını merak ediyorum. Birçok Atari 2600 oyununda, kontrol her 16,7 saniyede bir yoklanır ve oyuncu güncellemeleri 1-16 ms içinde gerçekleşir (dikey pozisyona bağlı olarak); modern ekipman bu kadar hızlı tepki veremiyor.
supercat

32

"Delta", "d" veya "Δ", matematiksel bağlamda "fark" anlamına gelir . Benzer anlamlara sahip iki sayı arasında bir fark olduğu zaman, bu farka "delta" veya "d" denebilir.

Deltalar oyun geliştirmede çok yaygındır. Örneğin, bir karakterin arasındaki fark, ikinci önce bir X-koordinatı ve kendi X-koordinatı hemen "delta X" olarak adlandırılabilir ve genel olarak ifade edilir dx, delta_xya da d_x.

Ayrıca, kodunuzda olduğu gibi iki kez arasındaki farkın olması çok yaygındır:

var delta = now - this.time;

Bu durumda, bu değişken depolanan zaman ile depolanan zaman arasındaki farkı this.timegösterir now.

Deltalar, zaman içindeki bir şeyin değişimini temsil etmek için yaygın olarak kullanılır. Örneğin, oyuncunun X koordinatının her karede 5 piksel değiştirmesi gerektiğini biliyorsanız, bu değişikliği bir delta olarak saklayabilirsiniz:

var delta_x = 5

Ve sonra, istediğiniz zaman değişikliği uygulamak için bu deltayı kullanın:

player.x = player.x + delta_x

Ancak bunun yalnızca bir kongre olduğunu unutmayın. Hiç kimse sizi değişkenlerinizi "delta" veya "d" olarak adlandırmaya zorlamaz, ancak bunu yapmak, değişkenin ne yapması gerektiğini anlamak için kodunuzu okuyan bir başkasına veya ileride okursanız kendinize yardımcı olabilir.

Programlamada yaygın olarak kullanılan diğer genel Yunanca harfler:

Epsilon : Çok küçük bir değer için. Kayan nokta veya hassas problemleri olan diğer değişkenleri karşılaştırırken yaygın olarak kullanılır:

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

Pi : adını taşıyan sabit için

Theta : açıları temsil etmek için

Lambda : isimsiz işlevleri veya kapanışları temsil etmek için


1
Ayrıca, π, 2π, π / 2, π / 4 ve e gibi birçok katları göreceksiniz (Euler sabiti).
jzx

@Thomas: Elbette, matematiksel temeli olan herhangi bir program teorik gösterimi koda getirecektir. " Programlamada yaygın olarak kullanılan diğer genel Yunanca harfler " cümlesine dikkat edin . " bazı grafik kodları" neredeyse "yaygın" veya "yaygın olarak kullanılan" olarak nitelenmez. Bunların, kullanılabilecek tek Yunan harfleri olduğunu ya da bu Yunan harfleri için belirleyebileceğiniz tek anlamların hiçbir zaman olduğunu iddia etmedim.
Panda Pajama

@ yzx: Son kontrol ettiğimde, Euler sabiti "e" latin harfini kullandı . Kodda görünen matematiksel sabitlerden değil, genel olarak kodda kullanılan Yunanca harflerden bahsediyordum.
Panda Pajama

@PandaPajama Açılmadığım için yorumumu sildim.
Thomas

3
Arkadaşlarınız özellikle kalça ise, 2π yerine Tau (τ) bile görebilirsiniz.
Kaz Ejderi

3

dt kısaltması delta time . Kare hızı ne olursa olsun, oyunun aynı hızda çalışmasını sağlamak için kare hızı hesaplamasında kullanılır.

Hakkında daha fazla bilgi framerate independencebulunabilir burada .


3

dt (delta süresi), döngünüzün her döngüsü / görüntü karesi (veya istediğiniz zaman damgası) arasındaki süredir. Bu delta zamanı ile zaman içinde belirli değerleri uzatabiliriz. Tıpkı gerçek dünyada olduğu gibi, zamanla belirli fizik özelliklerini ölçeriz.

Diyelim ki oyunumuzu saniyede 60 kare yapalım. Oyuncumuzun saniyede 5 piksel hareket etmesini istiyorsak,

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

veya

 5 * (newTime - oldTime); //aka dt

Karakter, 5 kareyi 60 karenin üzerine taşır. Döngünüz ne kadar uzun sürerse delta süresi o kadar büyük olur.

Her kare hızında (1/30, 1/25, vb.) Sonuç aynı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.