आपको सोचने की जरूरत है, धागे के वास्तविक लाभ क्या हैं? याद रखें कि एक कोर मशीन पर, धागे वास्तव में समवर्ती निष्पादन की अनुमति नहीं देते हैं, बस इसकी छाप। दृश्यों के पीछे, सीपीयू अलग-अलग धागे के बीच संदर्भ-स्विचिंग है, हर बार थोड़ा काम करता है। इसलिए, यदि मेरे पास कई कार्य हैं जिनमें कोई प्रतीक्षा नहीं है, तो उन्हें एक साथ चलाना (एक कोर पर) उन्हें रैखिक रूप से चलाने से कोई तेज नहीं होगा। वास्तव में, यह अक्सर संदर्भ-स्विचिंग के अतिरिक्त ओवरहेड के कारण धीमा हो जाएगा।
यदि ऐसा है तो, कभी भी एक कोर मशीन पर धागे का उपयोग क्यों करें? खैर, क्योंकि कभी-कभी कार्यों में कुछ बाहरी संसाधनों जैसे कि डिस्क या अन्य हार्डवेयर डिवाइस पर उपलब्ध होने के लिए प्रतीक्षा की लंबी अवधि शामिल हो सकती है। एक प्रतीक्षा चरण में कार्य करते समय, थ्रेडिंग अन्य कार्यों को जारी रखने की अनुमति देता है, इस प्रकार CPU के समय को अधिक दक्षता का उपयोग करता है।
दूसरा, कार्यों में कुछ प्रकार की समयसीमा हो सकती है, जिसमें विशेष रूप से यदि वे किसी ईवेंट का जवाब दे रहे हैं। क्लासिक उदाहरण एक एप्लिकेशन का यूजर इंटरफेस है। कंप्यूटर को जितनी जल्दी हो सके उपयोगकर्ता एक्शन इवेंट्स का जवाब देना चाहिए, भले ही यह किसी अन्य लंबे समय तक चलने वाले काम को करने में व्यस्त हो, अन्यथा उपयोगकर्ता उत्तेजित हो जाएगा और मान सकता है कि एप्लिकेशन क्रैश हो गया है। थ्रेडिंग यह होने की अनुमति देता है।
खेलों के लिए, मैं एक गेम प्रोग्रामर नहीं हूं, लेकिन स्थिति की मेरी समझ यह है: 3 डी गेम गेम की दुनिया का प्रोग्रामेटिक मॉडल बनाते हैं; खिलाड़ियों, दुश्मनों, वस्तुओं, इलाके, आदि। इस खेल की दुनिया को पिछले चरणों के बाद से समाप्त होने वाले समय के आधार पर अलग-अलग चरणों में अपडेट किया गया है। इसलिए, यदि गेम लूप के आखिरी बार 1ms बीत चुका है, तो ऑब्जेक्ट की स्थिति को इसके वेग का उपयोग करके और डेल्टा निर्धारित करने के लिए विलुप्त समय का उपयोग करके अद्यतन किया जाता है (जाहिर है कि भौतिकी उससे थोड़ा अधिक जटिल है, लेकिन आपको लगता है कि विचार)। एआई और इनपुट कुंजी जैसे अन्य कारक भी अपडेट में योगदान दे सकते हैं। जब सबकुछ खत्म हो जाता है, तो अपडेटेड गेम वर्ल्ड को एक नए फ्रेम के रूप में प्रस्तुत किया जाता है और प्रक्रिया फिर से शुरू होती है। यह प्रक्रिया आमतौर पर प्रति सेकंड कई बार होती है।
जब हम इस तरह से गेम लूप के बारे में सोचते हैं, तो हम देख सकते हैं कि इंजन वास्तव में थ्रेडिंग के लिए एक बहुत ही समान लक्ष्य प्राप्त कर रहा है। इसमें कई लंबे समय तक चलने वाले कार्य हैं (दुनिया के भौतिकी को अद्यतन करना, उपयोगकर्ता इनपुट को संभालना आदि), और यह इंप्रेशन देता है कि वे काम के छोटे टुकड़ों में उन्हें तोड़कर और इन टुकड़ों को अंतःस्थापित करके एक साथ हो रहे हैं, लेकिन इसके बजाय प्रत्येक पर बिताए गए समय का प्रबंधन करने के लिए सीपीयू या ऑपरेटिंग सिस्टम, यह स्वयं ही कर रहा है। इसका मतलब यह है कि यह सभी अलग-अलग कार्यों को सही ढंग से सिंक्रनाइज़ कर सकता है, और वास्तविक थ्रेडिंग के साथ आने वाली जटिलताओं से बचें: ताले, पूर्व-उत्सर्जन, पुन: प्रवेश कोड इत्यादि। इस दृष्टिकोण के लिए कोई प्रदर्शन प्रभाव नहीं है, क्योंकि जैसा कि हमने कहा था एकल कोर मशीन वैसे भी वास्तव में कोड को रैखिक रूप से निष्पादित कर सकती है।
बहु-कोर सिस्टम होने पर चीजें बदलती हैं। अब, कार्य वास्तव में समवर्ती रूप से चल रहे हैं और गेम विश्व अपडेट के विभिन्न हिस्सों को संभालने के लिए थ्रेडिंग का उपयोग करने का वास्तव में लाभ हो सकता है, जब तक हम परिणामों को लगातार फ्रेम प्रस्तुत करने के लिए सिंक्रनाइज़ कर सकते हैं। इसलिए हम उम्मीद करेंगे कि बहु-कोर सिस्टम के आगमन के साथ, गेम इंजन डेवलपर्स इस पर काम करेंगे। और इसलिए यह पता चला है, वे हैं। हाफ लाइफ के निर्माताओं वाल्व ने हाल ही में अपने स्रोत इंजन में बहु-प्रोसेसर समर्थन पेश किया है, और मुझे लगता है कि कई अन्य इंजन डेवलपर्स सूट का पालन कर रहे हैं।
ठीक है, यह मेरी अपेक्षा से थोड़ा लंबा हो गया। मैं थ्रेडिंग या गेम्स विशेषज्ञ नहीं हूं, लेकिन मुझे आशा है कि मैंने कोई विशेष रूप से चमकदार त्रुटियां नहीं की हैं।अगर मैं मुझे यकीन है कि लोग मुझ को सही कर देंगे :)
समांतरता कठिन है। सिर्फ "वाह, यह मुश्किल है" -हार्ड लेकिन सैद्धांतिक रूप से, कई समस्याएं समानांतर नहीं हैं "-हार्ड। –