2011-08-28 23 views
7

मैं खेल विकास के लिए कुछ लुआ सीख रहा हूं। मैंने अन्य भाषाओं में कोरआउट के बारे में सुना लेकिन वास्तव में लुआ में उन पर आया। मैं वास्तव में समझ में नहीं आता कि वे कितने उपयोगी हैं, मैंने बहुत सी बात सुनी है कि यह बहु-थ्रेडेड चीजों को करने का तरीका कैसे हो सकता है लेकिन वे क्रम में नहीं चल रहे हैं? तो सामान्य कार्यों से क्या लाभ होगा जो क्रम में भी चलते हैं? मैं सिर्फ यह नहीं समझ रहा हूं कि वे कार्यों से कितने अलग हैं, सिवाय इसके कि वे रोक सकते हैं और एक सेकंड के लिए एक और रन दे सकते हैं। ऐसा लगता है कि उपयोग केस परिदृश्य मेरे लिए इतना बड़ा नहीं होगा।कोरआउट के लाभ क्या हैं?

कोई भी कुछ प्रकाश डालने की देखभाल करता है कि किसी से उन्हें फायदा क्यों होगा?

विशेष रूप से एक खेल प्रोग्रामिंग परिप्रेक्ष्य से अंतर्दृष्टि अच्छा होगा ^^

+0

वे पिछली शताब्दी से तारीखें हैं। बहु-कोर सीपीयू और सीपीयू कैश को जंकिंग से दंडित करने में देरी उनकी उपयोगिता को डाल देती है और समाप्त होती है। धागे यह हैं। –

+2

@ हंस पासेंट: यह पूरी तरह से कोरआउट के बिंदु को याद करता है। Coroutines धागे के लिए एक प्रतिस्थापन नहीं हैं और आप उन चीजों के लिए उपयोग नहीं करते हैं जिनके लिए आप धागे का उपयोग करेंगे। बिंदु स्वच्छ और आरामदायक (nonconcurrent!) कोड लिखना है जिसमें एक फ़ंक्शन कॉल रोका जा सकता है, ताकि मुख्य लूप को अवरुद्ध किए बिना आप अधिक जानकारी प्राप्त कर सकें। ऐसा करने के लिए कोई उपर नहीं है, जिस तरह से लुआ इसे करता है। उस उपयोग मामले में ऑपरेटिंग सिस्टम थ्रेड एक खराब विकल्प होगा। –

उत्तर

0

हम एक परियोजना मैं पर काम कर रहा हूँ पर उन्हें का उपयोग करें। हमारे लिए मुख्य लाभ यह है कि कभी-कभी एसिंक्रोनस कोड के साथ, ऐसे बिंदु होते हैं जहां यह महत्वपूर्ण है कि कुछ निर्भरताओं के कारण कुछ हिस्सों को क्रम में चलाया जाता है। यदि आप कोरआउट का उपयोग करते हैं, तो आप एक प्रक्रिया को पूरा करने के लिए एक और प्रक्रिया की प्रतीक्षा कर सकते हैं। ऐसा करने का एकमात्र तरीका नहीं है, लेकिन वे कुछ अन्य तरीकों से बहुत सरल हो सकते हैं।

0

मुझे यह नहीं लगता कि वे को छोड़कर कार्यों से कितने अलग हैं, वे रोक सकते हैं और एक सेकंड के लिए एक और रन दे सकते हैं।

यह एक बहुत ही महत्वपूर्ण संपत्ति है। मैंने एक गेम इंजन पर काम किया जो उन्हें समय के लिए इस्तेमाल करता था। उदाहरण के लिए, हमारे पास एक इंजन था जो एक सेकंड में 10 टिकों पर दौड़ता था, और आप प्रतीक्षा करने के लिए प्रतीक्षा करने के लिए प्रतीक्षा कर सकते हैं (x), और उपयोगकर्ता परत में, आप प्रतीक्षा कर सकते हैं प्रतीक्षा करें (x) x फ्रेम प्रतीक्षा करें।

यहां तक ​​कि पेशेवर देशी समेकन पुस्तकालय भी उसी प्रकार के उपज व्यवहार का उपयोग करते हैं।

16

ठीक है, खेल के विकास के मामले में सोचें।

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

अब देखें कि आपका गेम कैसे काम करता है। प्रत्येक फ्रेम, यह संभवतः अन्य चीजों के बीच एआई, टकराव परीक्षण, एनीमेशन, प्रतिपादन, और ध्वनि को संसाधित करना चाहिए। आप केवल हर फ्रेम सोच सकते हैं। तो आप इस तरह का कोड कैसे डालते हैं, जहां आपको अगले कार्य करने से पहले कुछ कार्यवाही पूरी करने की प्रतीक्षा करनी है?

यदि आपने सी ++ में कोई सिस्टम बनाया है, तो आपके पास एआई से पहले कुछ ऐसा होगा जो आपके पास होगा। प्रक्रिया करने के लिए कमांड का अनुक्रम होगा। उनमें से कुछ आदेश तात्कालिक होंगे, जैसे "इकाई एक्स को यहां जाने के लिए बताएं" या "यहां स्पॉन इकाई वाई"। दूसरों को इंतजार करना होगा, जैसे कि "इकाई जेड को यहां जाने के लिए कहें और अब तक यहां तक ​​कि आदेशों को संसाधित न करें।" कमांड प्रोसेसर को हर फ्रेम कहा जाना होगा, और इसे "इकाई स्थान पर है" जैसी जटिल परिस्थितियों को समझना होगा।

लुआ में, यह इस तरह दिखेगा:

local entityX = game:GetEntity("entityX"); 
entityX:GoToLocation(locX); 
local entityY = game:SpawnEntity("entityY", locY); 
local entityZ = game:GetEntity("entityZ"); 
entityZ:GoToLocation(locZ); 
do 
    coroutine.yield(); 
until (entityZ:isAtLocation(locZ)); 
return; 

सी ++ आकार पर, आप इस स्क्रिप्ट एक बार फ्रेम प्रति जब तक यह किया जाता है फिर से शुरू होगा। एक बार यह लौटने के बाद, आप जानते हैं कि कट्ससीन खत्म हो गया है, ताकि आप उपयोगकर्ता को नियंत्रण वापस कर सकें।

देखो कि लुआ तर्क कितना आसान है। यह वही करता है जो यह कहता है। यह स्पष्ट, स्पष्ट है, और इसलिए गलत होना बहुत मुश्किल है।

coroutines की शक्ति आंशिक रूप से, कुछ कार्य को पूरा एक शर्त सच्चा बनने के लिए प्रतीक्षा करने के बाद अगले काम पर जाने के लिए सक्षम किया जा रहा है।

+0

तो उदाहरण के लिए मेरे पास एक लोडिंग फ़ंक्शन हो सकता है जो कुछ चर शुरू करता है और कुछ लोडिंग स्क्रीन विवरण कहता है, फिर ड्रॉइंग फ़ंक्शन पर नियंत्रण पास करता है जो उन्हें खींचता है और मेरे गेम के लिए सब कुछ लोड करने के लिए लोडिंग फ़ंक्शन पर वापस नियंत्रण पास करता है? – Isaiah

+0

@ इसायाह: हाँ, आप ऐसा कर सकते हैं। –

+2

यदि आप इस पैटर्न के "असली जीवन" उदाहरण चाहते हैं तो यहां देखें: http://getmoai.com/moai-platform-tutorials/moai-tutorials-bug-squisher.html – catwell

0

गेम डेवलपर्स के लिए बहुत अच्छे उदाहरण हैं। मैं एप्लिकेशन एक्सटेंशन स्पेस में दूसरा दूंगा। उस परिदृश्य पर विचार करें जहां एप्लिकेशन में एक इंजन है जो सी में कोर कार्यक्षमता करते समय लुआ में उपयोगकर्ताओं के दिनचर्या चला सकता है। यदि उपयोगकर्ता को इंजन के लिए एक विशिष्ट स्थिति (उदाहरण के लिए डेटा प्राप्त करने की प्रतीक्षा) की प्रतीक्षा करने की आवश्यकता है, आप या तो करने के लिए:

  • बहु थ्रेड सी कार्यक्रम एक अलग थ्रेड में लुआ को चलाने के लिए और लॉकिंग और तुल्यकालन तरीकों में जोड़ने के लिए,
  • लुआ दिनचर्या Abend और शुरू से पुन: प्रयास एक राज्य के साथ के लिए पारित समारोह कुछ भी छोड़ने के लिए, कम से कम आपको लगता है कि केवल एक बार चलाने समझने का कोई कोड, या
  • लुआ दिनचर्या उपज और इसे फिर से शुरू फिर से चलाएं एक बार राज्य सी
  • +०१२३५१६४१०६१ पूरी हो गई है

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

1

Coroutines: आसान उपयोग करने के लिए, आराम से ऊपर पेंच करने के लिए जब कई स्थानों में इस्तेमाल किया।

बस सावधान रहें और कई स्थानों पर इसका उपयोग न करें। अपने संपूर्ण एआई कोड को कोरआउट पर निर्भर न करें।

Coroutines त्वरित सुधार कर रही है जब एक राज्य शुरू की है जो पहले अस्तित्व में नहीं था के लिए अच्छे हैं।

यह वही है जो जावा करता है। नींद() और प्रतीक्षा करें() दोनों कार्य आपके गेम को डीबग करना असंभव बनाने के सर्वोत्तम तरीके हैं। यदि मैं आप थे तो मैं पूरी तरह से किसी भी कोड से बचूंगा जिसे एक प्रतीक्षा() फ़ंक्शन को कोरआउटिन करता है।

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

Coroutines अच्छा है जब आप सर्वर ..database आदि (एक नहीं खेल) कर रहे हैं पाठ संपादक की तरह एक आवेदन आवेदन ..bank .. कर रहे हैं। खराब जब आप कोई गेम बना रहे हैं जहां किसी भी समय कुछ भी हो सकता है, तो आपको राज्यों की आवश्यकता होती है।

तो, मेरे दृश्य में कोरआउट्स प्रोग्रामिंग का एक बुरा तरीका है और छोटे स्टेटलेस कोड लिखने का बहाना है।

लेकिन यह सिर्फ मुझे है।

संबंधित मुद्दे