อะไรคือ“ เดลต้า” ในรหัสนี้? มันสะท้อนถึงสิ่งมาตรฐานในเกม dev หรือไม่?


24

ฉันรู้น้อยมากเกี่ยวกับการเขียนโปรแกรมเกม แต่ต้องการเรียนรู้เพิ่มเติม ฉันกำลังพยายามที่จะเข้าใจรหัสสำหรับนี้เกม ฉันพยายามที่จะเข้าใจว่าทำไมรหัสถึงผ่าน "delta" ไปยัง Shipcontrols.js ซึ่งเปลี่ยนทิศทางของเรือตามการป้อนข้อมูลของผู้ใช้

โดยทั่วไปเกมจะคำนวณ "เดลต้า" ทุกวง ...

นี่คือเวอร์ชั่นย่อของสแต็กที่ใช้ delta ถึงหนึ่งลูป ...

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

ก้าวเข้าสู่ที่นี่ ...

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

ก้าวเข้าสู่ที่นี่ ...

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

สิ่งใดที่เป็นเช่นนี้ ...

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

และนี่...

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

จุดเดลต้าที่นี่คืออะไร? มันแค่พยายามแนะนำองค์ประกอบของการสุ่มหรือไม่? รหัสสำหรับเกมนี้ดีมาก เหตุใดผู้ชายคนนี้จึงใช้เดลต้า


2
"มันแค่พยายามแนะนำองค์ประกอบของการสุ่ม?" ที่จริงแล้วตรงกันข้ามกันจริง ๆ แล้วจุดประสงค์ของสามเหลี่ยมปากแม่น้ำที่นี่คือการลดการสุ่มและปรับฟิสิกส์ในเกมของเครื่องยนต์ให้เป็นปกติ
zzzzBov

คำตอบ:


27

นี่คือ "เวลาเดลต้า" เป็นเวลาที่ผ่านไปนับตั้งแต่การอัปเดตก่อนหน้า จำเป็นเพื่อให้แน่ใจว่าภาพเคลื่อนไหวฟิสิกส์และอื่น ๆ กำลังทำงานด้วยความเร็วที่เหมาะสม

รหัสกำลังทำงานหนึ่งครั้งต่อการอัพเดตเฟรม อย่างไรก็ตามไม่มีการรับประกันว่าเฟรมจะถูกวาดด้วยความเร็วคงที่ หนึ่งเฟรมอาจใช้เวลา 1/60 ของวินาทีและเฟรมถัดไปอาจใช้เวลา 1/30 หากคุณไม่ได้วัดผลและพิจารณาเกมนี้จะกระวนกระวายใจและรันเร็วเกินไปหรือช้าเกินไปในสถานการณ์ต่าง ๆ

เวลา deltas มักจะใช้ในฟิสิกส์เนื่องจากเป็นวิธีที่ระบุสมการสำหรับการรวมออยเลอร์อย่างง่าย การบูรณาการความเร็วในตำแหน่งที่ถูกกำหนดให้เป็นที่ง่ายเป็นรหัสเช่นx1 = x0 + v * (t1 - t0) x += v * dtดังนั้นเวลาที่ต้องใช้ในการประเมินการอัพเดททางฟิสิกส์

มันเป็นเรื่องธรรมดามากที่จะมีการวัดและนำไปใช้กับเวลา delta


ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะมันอธิบายว่า 'dt' อาจแตกต่างกันมากซึ่งเป็นสาเหตุที่เราต้องแก้ไขการคำนวณทางฟิสิกส์ด้วย
BiAiB

มันอาจจะคุ้มค่าที่จะสังเกตว่าปัญหาสำคัญที่เกิดขึ้นกับ delta เวลาในบริบทบางอย่างคือในหลายกรณีพวกเขาจะถูก "ปิด" โดยกรอบ หากมีสิ่งใดทำให้การอัปเดตหนึ่งเฟรมใช้เวลานานเป็นสองเท่าเดลต้าจะใช้เมื่อคำนวณการกระทำของเฟรมนั้นจะเป็นเฟรมปกติแม้ว่าเฟรมจะไม่แสดงจนกว่าจะถึงเวลาที่วัตถุควรแสดงให้เห็นว่าขยับไปสองครั้ง อย่างที่พวกเขาทำ หากเวลาระหว่างเฟรมนั้นกับเฟรมถัดไปน้อยกว่าปกติ (อาจเกิดขึ้นหากตัวจับเวลาพยายาม "ทัน" เฟรมทั้งสองที่มีเวลาน้อยกว่าปกติระหว่างเฟรมจะแสดง ...
supercat

... ระยะทางที่มากกว่าปกติระหว่างตำแหน่งของวัตถุ)
supercat

@supercat: นั่นเป็นเพียงปกติแก้ไขสิ่งที่บันทึกเวลาของคุณ คุณยังคงต้องการเวลาในการคำนวณเฟรมต่อเฟรมเพื่อให้ทราบว่าจะทำการจำลองแบบคงที่เมื่อใด
Sean Middleditch

@SeanMiddleditch: ในฐานะคนที่มีรหัสเกมสำหรับ Atari 2600 ฉันพบว่ามีบางอย่างที่สงสัยว่าไม่มีใครอาละวาดความจริงที่ว่าในระบบที่ทันสมัยมีความล่าช้าที่หลีกเลี่ยงไม่ได้ระหว่างเมื่อผู้เล่นย้ายตัวควบคุมและเมื่อตัวละครตอบกลับ ในเกมอาตาริ 2600 หลายเกมตัวควบคุมจะทำการสำรวจทุก ๆ 16.7 มิลลิวินาทีและการอัพเดทของผู้เล่นจะเกิดขึ้นภายใน 1-16 มิลลิวินาที (ขึ้นอยู่กับตำแหน่งแนวตั้ง); อุปกรณ์ที่ทันสมัยไม่สามารถตอบสนองได้อย่างรวดเร็ว
supercat

32

"เดลต้า", "D" หรือ "Δ" หมายถึง "ความแตกต่าง" ในบริบททางคณิตศาสตร์ เมื่อใดก็ตามที่มีความแตกต่างระหว่างตัวเลขสองตัวที่มีความหมายคล้ายกันความแตกต่างนั้นอาจเรียกว่า "เดลต้า" หรือ "d"

เดลต้าเป็นเรื่องธรรมดาในการพัฒนาเกม ตัวอย่างเช่นความแตกต่างระหว่างตัวละคร X-ประสานงานหนึ่งวินาทีที่ผ่านมาและพิกัด x ตอนนี้สามารถเรียกว่า "เดลต้า x" และจะแสดงกันทั่วไปว่าเป็นdx, หรือdelta_xd_x

นอกจากนี้ยังเป็นเรื่องธรรมดามากที่จะมีความแตกต่างระหว่างสองครั้งตามที่คุณมีในรหัสของคุณ:

var delta = now - this.time;

ในกรณีนี้ตัวแปรที่แสดงถึงความแตกต่างระหว่างเวลาที่เก็บไว้ในที่และเวลาที่เก็บไว้ในthis.timenow

เดลต้ามักใช้เพื่อแสดงถึงการเปลี่ยนแปลงของบางสิ่งในเวลา ตัวอย่างเช่นหากคุณรู้ว่าพิกัด X ของผู้เล่นควรเปลี่ยน 5 พิกเซลทุกเฟรมคุณสามารถจัดเก็บการเปลี่ยนแปลงนี้เป็นเดลต้า:

var delta_x = 5

จากนั้นใช้เดลต้านั้นเพื่อใช้การเปลี่ยนแปลงทุกครั้งที่คุณต้องการ:

player.x = player.x + delta_x

แต่จำไว้ว่านี่เป็นเพียงการประชุม ไม่มีใครบังคับให้คุณตั้งชื่อตัวแปร "เดลต้า" หรือ "d" แต่การทำเช่นนั้นอาจช่วยให้คนอื่นที่อ่านโค้ดของคุณหรือตัวคุณเองถ้าคุณอ่านมันในอนาคตเพื่อทำความเข้าใจว่าตัวแปรควรทำอะไร

ตัวอักษรกรีกทั่วไปอื่น ๆ ที่ใช้กันอย่างแพร่หลายในการเขียนโปรแกรมคือ:

Epsilon : มีค่าน้อยมาก ใช้กันทั่วไปเมื่อเปรียบเทียบทศนิยมหรือตัวแปรอื่น ๆ ที่มีปัญหาความแม่นยำ:

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

Pi : สำหรับค่าคงที่บาร์นี้

Theta : ใช้แทนมุม

แลมบ์ดา : ใช้แทนฟังก์ชั่นที่ไม่ระบุตัวตนหรือการปิด


1
คุณจะเห็นทวีคูณของπเช่น2π, π / 2, π / 4 และ e (ค่าคงที่ของออยเลอร์)
jzx

@ โทมัส: แน่นอนว่าโปรแกรมใด ๆ ที่มีพื้นฐานทางคณิตศาสตร์จะนำสัญกรณ์ทางทฤษฎีมาเป็นรหัส สังเกตประโยค " ตัวอักษรกรีกทั่วไปอื่น ๆ ที่ใช้กันอย่างแพร่หลายในการเขียนโปรแกรมคือ" " โค้ดกราฟิกบางตัว " แทบจะไม่ถือว่าเป็น "สามัญ" หรือ "ใช้กันอย่างแพร่หลาย" ฉันไม่เคยอ้างสิทธิ์เหล่านี้เป็นตัวอักษรกรีกเท่านั้นที่สามารถใช้ได้และไม่ว่าจะเป็นความหมายเดียวที่คุณสามารถตั้งค่าสำหรับตัวอักษรกรีกเหล่านั้นได้
Panda Pajama

@yzx: ครั้งสุดท้ายที่ฉันตรวจสอบค่าคงที่ของออยเลอร์ใช้ตัวอักษรละติน "e" ฉันไม่ได้พูดถึงค่าคงที่ทางคณิตศาสตร์ที่ปรากฏในรหัส แต่แทนที่จะเป็นตัวอักษรกรีกที่ใช้กันทั่วไปในรหัส
Panda Pajama

@PandaPajama ฉันได้ลบความคิดเห็นของฉันเนื่องจากไม่ได้รับการต้อนรับ
โทมัส

3
หากสหายของคุณเป็นสะโพกโดยเฉพาะคุณอาจเห็น Tau (τ) แทน2π
Kaz Dragon

3

dtdelta timeย่อมาจาก มันถูกใช้ในการคำนวณอัตราเฟรมเพื่อประกันว่าเกมจะวิ่งด้วยความเร็วเดียวกันไม่ว่าจะเป็นอัตราเฟรมใด

ข้อมูลเพิ่มเติมเกี่ยวกับframerate independenceสามารถพบได้ที่นี่


3

dt (เวลาเดลต้า) คือเวลาระหว่างแต่ละรอบ / เฟรมการแสดงผล (หรือการประทับเวลาใด ๆ ที่คุณต้องการ) ของวงของคุณ ด้วยเวลาเดลต้านี้เราสามารถยืดค่าบางช่วงเวลา เช่นเดียวกับในโลกแห่งความจริงเราทำการวัดคุณสมบัติทางฟิสิกส์บางอย่างเมื่อเวลาผ่านไป

สมมติว่าเรารันเกม 60 เฟรมต่อวินาที ถ้าเราต้องการให้ผู้เล่นของเราขยับ 5 พิกเซลต่อวินาทีเราก็ทำได้

 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

หรือ

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

ตัวละครเคลื่อนไหว 5 พิกเซลมากกว่า 60 เฟรม ยิ่งรอบของคุณใช้เวลานานขึ้นเดลต้าที่ใหญ่กว่าจะได้รับ

สำหรับทุกอัตราเฟรม (1/30, 1/25 เป็นต้น) ผลลัพธ์จะเหมือนกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.