Apa gunanya "delta" dalam kode ini? Apakah itu mencerminkan hal standar dalam game dev?


24

Saya tahu sedikit tentang pemrograman game tetapi ingin belajar lebih banyak. Saya mencoba memahami kode untuk game ini . Saya mencoba memahami mengapa kode ini meneruskan "delta" ke Shipcontrols.js, yang mengubah arah kapal berdasarkan input pengguna.

Pada dasarnya gim ini menghitung "delta" setiap loop ...

Ini adalah versi singkatan dari stack yang menggunakan delta melalui satu loop ...

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

Langkah-langkah ke sini ...

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); 

Langkah-langkah ke sini ...

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

Yang melakukan hal-hal seperti ini ...

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

dan ini...

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

Apa gunanya delta di sini? Apakah itu hanya mencoba memperkenalkan unsur keacakan? Kode untuk game ini sangat bagus. Kenapa orang ini menggunakan delta?


2
"Apakah itu hanya mencoba memperkenalkan unsur keacakan?" Sebenarnya kebalikan yang tepat adalah benar, tujuan dari delta di sini adalah untuk mengurangi keacakan, dan menormalkan fisika dalam mesin game.
zzzzBov

Jawaban:


27

Ini adalah "delta waktu." Sudah berapa lama waktu berlalu sejak pembaruan sebelumnya. Penting untuk memastikan bahwa animasi, fisika, dan sebagainya berjalan dengan kecepatan yang tepat.

Kode berjalan sekali per pembaruan bingkai. Namun, tidak ada jaminan bahwa frame digambar dengan kecepatan konstan. Satu frame mungkin membutuhkan 1/60 detik dan yang berikutnya mungkin 1/30. Jika Anda tidak mengukur dan memperhitungkan hal ini, permainan akan gelisah dan berjalan terlalu cepat atau terlalu lambat dalam berbagai keadaan.

Delta waktu sering diterapkan dalam fisika karena itulah bagaimana persamaan tersebut ditentukan untuk integrasi Euler sederhana. Mengintegrasikan kecepatan ke posisi didefinisikan sebagai x1 = x0 + v * (t1 - t0)yang disederhanakan menjadi seperti kode x += v * dt. Oleh karena itu, delta waktu diperlukan untuk mengevaluasi pembaruan fisika.

Sangat, sangat normal untuk delta waktu untuk diukur dan diterapkan.


Saya pikir ini adalah jawaban terbaik karena menjelaskan 'dt' dapat sangat bervariasi, itulah sebabnya kita perlu menginterpolasi perhitungan fisika dengannya.
BiAiB

Mungkin perlu dicatat bahwa masalah utama dengan delta waktu dalam beberapa konteks adalah bahwa dalam banyak kasus mereka akan "mati" oleh suatu kerangka. Jika sesuatu menyebabkan pembaruan satu frame memakan waktu dua kali lebih lama dari biasanya, delta yang diterapkan saat menghitung tindakan frame itu akan menjadi yang biasa, meskipun frame tidak akan ditampilkan sampai waktu ketika objek akan ditampilkan telah bergerak dua kali lebih jauh seperti yang mereka lakukan. Jika waktu antara frame itu dan yang berikutnya lebih kecil dari biasanya (dapat terjadi jika timer mencoba untuk "mengejar", dua frame dengan waktu lebih sedikit dari biasanya di antara mereka akan menunjukkan ...
supercat

... jumlah yang lebih besar dari biasanya antara posisi objek).
supercat

@supercat: Itu baru saja Perbaiki barang Timestep Anda . Anda masih perlu delta waktu per-bingkai untuk mengetahui kapan harus melangkah simulasi tetap.
Sean Middleditch

@SeanMiddleditch: Sebagai seseorang yang memiliki kode game untuk Atari 2600, saya dalam beberapa hal ingin tahu bahwa tidak ada yang menyesali kenyataan bahwa pada sistem modern ada jeda yang tak terhindarkan antara ketika pemain menggerakkan pengontrol dan ketika karakter merespons. Pada banyak Atari 2600 game, kontrol disurvei setiap 16,7 ms dan pembaruan pemain terjadi dalam 1-16ms dari itu (tergantung pada posisi vertikal); peralatan modern tidak mampu bereaksi dengan cepat.
supercat

32

"Delta", "d" atau "Δ", berarti "perbedaan" dalam konteks matematika . Setiap kali ada perbedaan perbedaan antara dua angka dengan makna yang sama, perbedaan itu dapat disebut "delta", atau "d".

Delta sangat umum dalam pengembangan game. Misalnya, perbedaan antara koordinat X karakter satu detik yang lalu dan koordinat X sekarang dapat disebut "delta x", dan biasanya dilambangkan sebagai dx, delta_xatau d_x.

Juga, sangat umum untuk memiliki perbedaan antara dua kali, seperti yang Anda miliki dalam kode Anda:

var delta = now - this.time;

Dalam hal ini, variabel tersebut menunjukkan perbedaan antara beberapa waktu yang disimpan this.time, dan waktu yang disimpan now.

Delta biasanya digunakan untuk mewakili perubahan sesuatu dalam waktu. Jadi misalnya, jika Anda tahu bahwa koordinat X pemain harus mengubah 5 piksel setiap frame, Anda dapat menyimpan perubahan ini sebagai delta:

var delta_x = 5

Dan kemudian gunakan delta itu untuk menerapkan perubahan kapan pun Anda membutuhkannya:

player.x = player.x + delta_x

Tetapi ingat bahwa ini hanya sebuah konvensi. Tidak ada yang memaksa Anda untuk menamai variabel Anda "delta" atau "d", tetapi hal itu dapat membantu orang lain yang membaca kode Anda, atau diri Anda jika Anda membacanya di masa depan, untuk memahami apa yang seharusnya dilakukan variabel.

Huruf Yunani umum lainnya yang banyak digunakan dalam pemrograman adalah:

Epsilon : untuk nilai yang sangat kecil. Biasa digunakan ketika membandingkan floating point, atau variabel lain dengan masalah presisi:

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

Pi : untuk konstanta eponymous

Theta : untuk mewakili sudut

Lambda : untuk mewakili fungsi atau penutupan anonim


1
Anda juga akan melihat beberapa kelipatan π, seperti 2π, π / 2, π / 4, dan e (konstanta Euler).
jzx

@ Thomas: Tentu saja, setiap program dengan dasar matematika akan membawa notasi teoritis ke dalam kode. Perhatikan kalimat " Huruf Yunani umum lainnya yang banyak digunakan dalam pemrograman adalah". " sebagian kode grafis" hampir tidak memenuhi syarat sebagai "umum" atau "banyak digunakan". Saya tidak pernah mengklaim ini adalah satu-satunya huruf yunani yang dapat digunakan, atau bahwa itu adalah satu-satunya makna yang dapat Anda tetapkan untuk huruf-huruf yunani.
Panda Pajama

@ yzx: Terakhir kali saya memeriksa, konstanta Euler menggunakan huruf latin "e". Saya tidak berbicara tentang konstanta matematika yang muncul dalam kode, tetapi tentang huruf Yunani yang biasa digunakan dalam kode.
Panda Pajama

@ Pandaanda saya telah menghapus komentar saya karena tidak diterima.
Thomas

3
Jika kawan Anda sangat trendi, Anda mungkin bahkan melihat Tau (τ) bukannya 2π.
Kaz Dragon

3

dtsingkatan delta time. Ini digunakan dalam perhitungan frame rate untuk memastikan game berjalan pada kecepatan yang sama, apa pun frame rate-nya.

Informasi lebih lanjut framerate independencedapat ditemukan di sini .


3

dt (delta time) adalah waktu antara setiap siklus / render frame (atau cap waktu yang Anda inginkan) dari loop Anda. Dengan waktu delta ini kita dapat meregangkan nilai-nilai tertentu seiring waktu. Sama seperti di dunia nyata kita mengukur sifat fisika tertentu dari waktu ke waktu.

Katakanlah kita menjalankan game kita 60 frame per detik. Jika kami ingin pemain kami bergerak 5 piksel per detik, kami melakukannya

 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

atau

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

Karakter bergerak 5 piksel lebih dari 60 bingkai. Semakin lama siklus Anda, semakin besar waktu delta yang didapat.

Untuk setiap framerate (1/30, 1/25, dll) hasilnya akan sama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.