इस कोड में "डेल्टा" का क्या मतलब है? क्या यह खेल देव में एक मानक चीज को दर्शाता है?


24

मैं खेल प्रोग्रामिंग के बारे में बहुत कम जानता हूं, लेकिन अधिक सीखना चाहूंगा। मैं इस खेल के लिए कोड को समझने की कोशिश कर रहा हूं । मैं यह समझने की कोशिश कर रहा हूं कि शिप शिपकंट्रोलज को कोड "डेल्टा" क्यों दे रहा है, जो उपयोगकर्ता इनपुट के आधार पर जहाज की दिशा बदल देता है।

मूल रूप से खेल "लूप" की गणना हर लूप ...

यहाँ स्टैक का संक्षिप्त रूप है जो डेल्टा का उपयोग करता है एक लूप ...

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 वां लग सकता है। यदि आप इसके लिए उपाय नहीं करते हैं और खाते हैं, तो खेल चिड़चिड़ा होगा और विभिन्न परिस्थितियों में बहुत तेज या बहुत धीमी गति से चलेगा।

फिजिक्स में टाइम डेल्टास अक्सर लागू होता है क्योंकि साधारण ईयूलर इंटीग्रेशन के लिए समीकरण कैसे निर्दिष्ट किए जाते हैं। स्थिति में वेग को एकीकृत करना इस तरह परिभाषित किया x1 = x0 + v * (t1 - t0)गया है जैसे कोड में सरलताx += v * dt । इसलिए, भौतिकी अपडेट का मूल्यांकन करने के लिए समय की आवश्यकता होती है।

मापा जाना और लगाया जाना समय के लिए बहुत सामान्य है।


मुझे लगता है कि यह सबसे अच्छा उत्तर है क्योंकि यह बताता है कि 'dt' बहुत भिन्न हो सकता है, यही कारण है कि हमें इसके लिए भौतिकी गणनाओं को प्रक्षेपित करने की आवश्यकता है।
BiiBB

यह ध्यान देने योग्य हो सकता है कि कुछ संदर्भों में समय की देरी के साथ एक बड़ी समस्या यह है कि कई मामलों में वे एक फ्रेम द्वारा "बंद" होंगे। यदि कोई चीज़ एक फ्रेम अपडेट को हमेशा की तरह दो बार लेने का कारण बनती है, तो उस फ्रेम के कार्यों की गणना करते समय डेल्टा लागू होता है, भले ही वह फ्रेम तब तक प्रदर्शित नहीं होगा जब तक कि वस्तुओं को तब तक नहीं दिखाया जाना चाहिए जब तक कि दो बार दूर नहीं ले जाया जाए। जैसा उन्होंने किया। यदि उस फ्रेम और अगले के बीच का समय सामान्य से छोटा है (हो सकता है कि अगर टाइमर "पकड़ने" की कोशिश करता है, तो दोनों के बीच सामान्य से कम समय वाले दो फ्रेम दिखाएंगे ...
20

... वस्तु की स्थिति के बीच की दूरी से अधिक बड़ा-सामान्य राशि)।
सुपरकैट

@ सुपरकैट: यह सिर्फ आपके टाइमस्टेप सामान को ठीक करना है । हालांकि, एक निश्चित सिमुलेशन को कदम रखने के लिए आपको अभी भी प्रति-फ्रेम समय डेल्टा की आवश्यकता है।
सीन मिडलिचविच

@ सीनमिडलडिच: जैसा कि किसी ने अटारी 2600 के लिए गेम को कोड किया है, मुझे यह कुछ इस तरह से उत्सुक लगता है कि किसी ने इस तथ्य पर अफसोस नहीं जताया कि आधुनिक सिस्टम पर खिलाड़ी के नियंत्रक होने के दौरान और चरित्र का जवाब देने के बीच एक अपरिहार्य अंतराल है। कई अटारी 2600 खेलों पर, नियंत्रण हर 16.7ms परागित होता है और खिलाड़ी अपडेट 1-16ms (ऊर्ध्वाधर स्थिति के आधार पर) के भीतर होते हैं; आधुनिक उपकरण जल्दी से प्रतिक्रिया करने में असमर्थ हैं।
सुपरकैट

32

"डेल्टा", "डी" या "Δ", का अर्थ गणितीय संदर्भ में "अंतर" है । जब भी दो समान संख्याओं के बीच अंतर होता है, तो उस अंतर को "डेल्टा", या "d" कहा जा सकता है।

खेल के विकास में देरी बहुत आम है। उदाहरण के लिए, एक वर्ण के एक्स-समन्वय के बीच का अंतर एक सेकंड पहले और उसके एक्स-समन्वय को अब "डेल्टा एक्स" कहा जा सकता है, और आमतौर पर के रूप में चिह्नित किया जाता है dx, delta_xया d_x

इसके अलावा, आपके कोड में दो बार अंतर होना बहुत आम है:

var delta = now - this.time;

इस स्थिति में, वह चर कुछ समय में संग्रहित समय this.timeऔर में संग्रहीत समय के बीच के अंतर को दर्शा रहा है now

डेल्टास आमतौर पर समय में किसी चीज के परिवर्तन का प्रतिनिधित्व करने के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि आप जानते हैं कि एक खिलाड़ी के एक्स कोऑर्डिनेट को हर फ्रेम में 5 पिक्सेल बदलने चाहिए, तो आप इस बदलाव को एक डेल्टा के रूप में संग्रहीत कर सकते हैं:

var delta_x = 5

और फिर उस डेल्टा का उपयोग करें जब भी आपको इसकी आवश्यकता हो, परिवर्तन लागू करें:

player.x = player.x + delta_x

लेकिन याद रखें कि यह केवल एक सम्मेलन है। कोई भी आपको अपने चर "डेल्टा" या "घ" का नाम देने के लिए मजबूर नहीं करता है, लेकिन ऐसा करने से आपके कोड को पढ़ने वाले किसी अन्य व्यक्ति की मदद हो सकती है, या यदि आप भविष्य में इसे पढ़ते हैं, तो यह समझने के लिए कि चर क्या करना है।

प्रोग्रामिंग में व्यापक रूप से उपयोग किए जाने वाले अन्य सामान्य ग्रीक अक्षर हैं:

एप्सिलॉन : बहुत कम मूल्य के लिए। फ़्लोटिंग पॉइंट, या अन्य चरों की सटीक समस्याओं की तुलना करते समय आमतौर पर उपयोग किया जाता है:

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

Pi : eponymous स्थिरांक के लिए

थीटा : कोणों का प्रतिनिधित्व करने के लिए

लैम्ब्डा : अनाम कार्यों या क्लोजर का प्रतिनिधित्व करने के लिए


1
आपको π के कुछ गुणक भी दिखाई देंगे, जैसे 2π, les / 2, 4/4, और e (Euler's constant)।
jzx

@ थोमस: निश्चित रूप से, गणितीय आधार के साथ कोई भी कार्यक्रम कोड में सैद्धांतिक संकेतन लाएगा। वाक्य को ध्यान दें " प्रोग्रामिंग में व्यापक रूप से उपयोग किए जाने वाले अन्य सामान्य ग्रीक अक्षर हैं"। " कुछ ग्राफिक्स कोड" शायद ही "सामान्य" या "व्यापक रूप से उपयोग किए जाने वाले" के रूप में योग्य हैं। मैंने कभी दावा नहीं किया कि ये केवल ग्रीक अक्षर हैं जिनका उपयोग किया जा सकता है, और न ही केवल वे अर्थ हैं जो आप उन ग्रीक पत्रों के लिए निर्धारित कर सकते हैं।
पांडा पायजामा

@yzx: पिछली बार जब मैंने जाँच की थी, यूलर के निरंतर ने लैटिन पत्र "ई" का उपयोग किया था । मैं गणितीय स्थिरांक के बारे में बात नहीं कर रहा था जो कोड में दिखाई देते हैं, लेकिन बजाय कोड में आमतौर पर इस्तेमाल होने वाले ग्रीक अक्षरों के बारे में।
पांडा पायजामा

@PandaPajama मैंने अपनी टिप्पणी हटा दी है क्योंकि यह स्वागत योग्य नहीं है।
थॉमस

3
यदि आपके साथी विशेष रूप से कूल्हे हैं, तो आप 2rad के बजाय ताऊ (are) भी देख सकते हैं।
काज़ ड्रैगन

3

dt के लिए खड़ा है delta 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

चरित्र 60 फ्रेम पर 5 पिक्सेल चलता है। आपके चक्र को जितना अधिक समय लगेगा उतना बड़ा डेल्टा समय मिलेगा।

हर फ्रैमरेट (1/30, 1/25, आदि) के लिए परिणाम समान होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.