2010-01-05 21 views
5

मैंने देखा है कि कुछ प्रोग्रामर समय पर अंतर के आधार पर वस्तुओं को एनिमेट करते हैं। मुझे यकीन नहीं है कि क्यों या यह तार्किक है। क्या किसी को महत्व पता है?एनिमेशंस कभी-कभी पास किए गए समय के आधार पर चरणों का उपयोग करके क्यों किया जाता है?

var timePassed:int = getTimer()-lastTime; 
lastTime += timePassed; 
var newBallX = ball.x + ballDX*timePassed; 
var newBallY = ball.y + ballDY*timePassed; 
+0

इस धागे को देखें: http://stackoverflow.com/questions/1284886/optimizing-transition-movement-smoothness-for-a-2d-flash-game – Cay

उत्तर

16

आप समय के आधार पर चेतन है, तो आप अपने आप को फ़्रेमरेट से स्वतंत्र बनाने:

नीचे कोड का एक टुकड़ा बताते हैं कि मैं क्या मतलब है। इससे कोई फर्क नहीं पड़ता कि कितने फ्रेम पास हुए हैं, आपकी गेंद एक ही दूरी पर एक ही दूरी पर चलेगी। फ्रेमरेट के आधार पर इसकी तुलना करें, जो कि कई चरों पर निर्भर है, जैसे कि एनीमेशन करने के लिए कितनी प्रोसेसिंग पावर उपलब्ध है।

यह एक आम गेम-भौतिकी मुद्दा है - इस पर अधिक विस्तृत जानकारी के लिए ग्लेन फिडलर के उत्कृष्ट "Fix Your Timestep!" article देखें। (यह सही समय पर आपके दिशा वैक्टरों को गुणा करने से थोड़ा अधिक जटिल है।)

+1

और यदि आपने कभी फ्रेम दर देखी है एक चल रहा एसडब्ल्यूएफ, आप पूरी तरह से जॉन के जवाब की आवश्यकता को समझेंगे :) – Aaron

1

ऐसा क्यों नहीं करते? क्या करने के विरोध में? यह एक साधारण रैखिक गति सही है? यहां एक विचार है: यह इस मामले में गेंद को अपने इच्छित स्थिति के साथ पकड़ने की अनुमति देता है, अन्य कार्यक्रम कंप्यूटर को धीमा कर रहे हैं।

+0

मैंने इसके बारे में सोचा। – numerical25

0

एक आधुनिक कंप्यूटर ऑपरेटिंग सिस्टम एक साथ कई कार्यों को चलाता है, और आपको हमेशा नियमित अंतराल पर अपना समय स्लाइस नहीं मिलता है। रीयल टाइम घड़ी में अंतर का उपयोग करके, आप गति बनाम को सुचारू बनाते हैं यदि आप लूप के माध्यम से हर बार एक ही राशि ले जाते हैं, जो इसे वापस देखने से पहले किसी अन्य प्रक्रिया में कुछ और मिलीसेकंड दिए जाने पर झटकेदार दिखने का कारण बन सकता है तुम्हारे लिए।

4

तर्क सरल है।

BallDX => गेंद डेल्टा एक्स => दूरी गेंद पर एक्स स्थानांतरित कर सकते हैं एक दूसरे

timepassed => समय की राशि से पारित कर दिया

if OldBallX = 0 
if BallDX = 10 
if TimePassed = 1 sec 
Then NewBallX = OldBallX + (BallDX*TimePassed) 

इसका मतलब है

NewBallX = 0 + (10 * 1) = 10 pixels 
में समन्वय

उस मामले में

if TimePassed = 0.5 sec (half a second) 

फिर

NewBallX = 0 + (10 * 0.5) = 5 pixels 

तार्किक?

0

फ़्रेमेट से स्वतंत्र होने का सबसे महत्वपूर्ण पहलू यह है कि आपको फ़्रेमेट को चेन करने की आवश्यकता नहीं है। यह अंधेरे युग में वापस होता था, कि जितना संभव हो सके सीपीयू का उपयोग करने के लिए गेम लिखे जाएंगे और फ्रेम दर सीपीयू की गति से निर्धारित की जाएगी। मुझे अपनी 16 मेगाहर्ट्ज मशीन पर गेम खेलना याद है जो चीजें इतनी तेज़ी से उड़ती हैं कि आप प्रतिक्रिया नहीं दे सकते, क्योंकि वे 1 मेगाहर्ट्ज मशीनों के लिए लिखे गए थे। प्रोग्रामर ने इस पर ध्यान दिया और उन खेलों को लिखना शुरू किया जो फ्रेमरेट को दबाते थे, आमतौर पर शुरुआती सालों में 30 एफपीएस पर, बाद में 60 एफपीएस (आमतौर पर मॉनिटर के वीएसवाईएनसी को बंद कर दिया जाता है)। इसने समस्या हल की, लेकिन हम उन लोगों के लिए वास्तव में परेशान थे जो भयानक कंप्यूटर के साथ अधिक तरल गति चाहते थे। आखिरकार उन्होंने फ़्रेमेटेट से पूरी तरह से स्वतंत्र गेम लिखना शुरू किया, जो आपको 700fps पर एक गेम खेलने की अनुमति देता है और चिकनी ग्राफिक्स को छोड़कर, 20fps पर समान अनुभव प्राप्त करता है। और यह खेल के दौरान लोड लोड के साथ भी सामना कर सकता है, जैसा कि अन्य ने कहा है, जो आज के मल्टीटास्किंग ओएस के साथ बहुत महत्वपूर्ण हो सकता है।

0

तुम समय के एक समारोह के रूप में एनीमेशन बनाने हैं, तो आप फ्रेम दर कुछ हद तक स्वतंत्र है, जिसका अर्थ है कि यदि आप 24fps के लिए अपने एनीमेशन बनाने के लिए, आप आसानी से एनीमेशन समायोजित फिट करने के लिए एक 30 एफपीएस कर सकते हैं हो सकता है परिदृश्य ही वह डायनामिक हो

यह है छोटी कहानी, पूरी जानकारी के लिए रॉबर्ट पेनर के अच्छे ol पर एक नजर है (जैसा कि में एक समारोह/ चित्र फ्रेम दर फ्रेम करने के लिए जहां की योजना बना सब कुछ है विरोध किया द्वारा परिभाषित) 'अध्याय Motion, Tweening and Easing पर।