ठीक है, खेल के विकास के मामले में सोचें।
मान लें कि आप कट्ससेन या शायद एक ट्यूटोरियल कर रहे हैं। किसी भी तरह से, आपके पास कुछ इकाइयों को भेजे गए आदेशों का क्रमबद्ध अनुक्रम है। एक इकाई किसी स्थान पर जाती है, किसी लड़के से बात करती है, फिर कहीं और चलता है। इत्यादि। कुछ आदेश तब तक शुरू नहीं हो सकते जब तक कि अन्य समाप्त नहीं हो जाते।
अब देखें कि आपका गेम कैसे काम करता है। प्रत्येक फ्रेम, यह संभवतः अन्य चीजों के बीच एआई, टकराव परीक्षण, एनीमेशन, प्रतिपादन, और ध्वनि को संसाधित करना चाहिए। आप केवल हर फ्रेम सोच सकते हैं। तो आप इस तरह का कोड कैसे डालते हैं, जहां आपको अगले कार्य करने से पहले कुछ कार्यवाही पूरी करने की प्रतीक्षा करनी है?
यदि आपने सी ++ में कोई सिस्टम बनाया है, तो आपके पास एआई से पहले कुछ ऐसा होगा जो आपके पास होगा। प्रक्रिया करने के लिए कमांड का अनुक्रम होगा। उनमें से कुछ आदेश तात्कालिक होंगे, जैसे "इकाई एक्स को यहां जाने के लिए बताएं" या "यहां स्पॉन इकाई वाई"। दूसरों को इंतजार करना होगा, जैसे कि "इकाई जेड को यहां जाने के लिए कहें और अब तक यहां तक कि आदेशों को संसाधित न करें।" कमांड प्रोसेसर को हर फ्रेम कहा जाना होगा, और इसे "इकाई स्थान पर है" जैसी जटिल परिस्थितियों को समझना होगा।
लुआ में, यह इस तरह दिखेगा:
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 की शक्ति आंशिक रूप से, कुछ कार्य को पूरा एक शर्त सच्चा बनने के लिए प्रतीक्षा करने के बाद अगले काम पर जाने के लिए सक्षम किया जा रहा है।
वे पिछली शताब्दी से तारीखें हैं। बहु-कोर सीपीयू और सीपीयू कैश को जंकिंग से दंडित करने में देरी उनकी उपयोगिता को डाल देती है और समाप्त होती है। धागे यह हैं। –
@ हंस पासेंट: यह पूरी तरह से कोरआउट के बिंदु को याद करता है। Coroutines धागे के लिए एक प्रतिस्थापन नहीं हैं और आप उन चीजों के लिए उपयोग नहीं करते हैं जिनके लिए आप धागे का उपयोग करेंगे। बिंदु स्वच्छ और आरामदायक (nonconcurrent!) कोड लिखना है जिसमें एक फ़ंक्शन कॉल रोका जा सकता है, ताकि मुख्य लूप को अवरुद्ध किए बिना आप अधिक जानकारी प्राप्त कर सकें। ऐसा करने के लिए कोई उपर नहीं है, जिस तरह से लुआ इसे करता है। उस उपयोग मामले में ऑपरेटिंग सिस्टम थ्रेड एक खराब विकल्प होगा। –