मेरे पास कितने धागे होने चाहिए, और किस लिए?


81

क्या मुझे रेंडरिंग और लॉजिक के लिए अलग-अलग थ्रेड्स चाहिए, या इससे भी ज्यादा?

मुझे डेटा सिंक्रोनाइज़ेशन के कारण होने वाले अपार प्रदर्शन की जानकारी है (अकेले किसी भी म्यूटेक्स ताले को छोड़ दें)।

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


6
कौन सा प्लेटफ़ॉर्म? पीसी, NextGen कंसोल, स्मार्टफोन?
एलिस

एक बात है जो मैं सोच सकता हूं कि इसके लिए मल्टी-थ्रेडिंग की आवश्यकता होगी; नेटवर्किंग।
साबुन

अपवादों को छोड़ दें, जब ताले शामिल होते हैं तो कोई "अपार" धीमा नहीं होता है। यह एक शहरी किंवदंती है, और एक पूर्वाग्रह है।
v.oddou

जवाबों:


61

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

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

सबसिस्टम थ्रेड्स का एक अन्य विकल्प अलगाव में प्रत्येक सबसिस्टम को समानांतर करना है। अर्थात्, अपने स्वयं के थ्रेड्स में रेंडरिंग और फिजिक्स चलाने के बजाय, एक बार में अपने सभी कोर का उपयोग करने के लिए भौतिकी सबसिस्टम लिखें, एक बार में अपने सभी कोर का उपयोग करने के लिए रेंडरिंग सबसिस्टम लिखें, फिर दोनों सिस्टम को क्रमिक रूप से चलाएं (या इंटरलेस्ड) आपके खेल वास्तुकला के अन्य पहलुओं पर निर्भर करता है)। उदाहरण के लिए, भौतिकी सबसिस्टम में आप खेल में सभी बिंदुओं को ले सकते हैं, उन्हें अपने कोर के बीच विभाजित कर सकते हैं, और फिर सभी कोर उन्हें एक बार में अपडेट कर सकते हैं। प्रत्येक कोर तब अच्छे इलाके के साथ तंग छोरों में आपके डेटा पर काम कर सकता है। समानांतरवाद की यह लॉक-स्टेप शैली एक जीपीयू के समान है। यहाँ सबसे कठिन हिस्सा यह सुनिश्चित करने में है कि आप अपने काम को बारीक-बारीक टुकड़ों में विभाजित कर रहे हैं जैसे कि इसे समान रूप से विभाजित करनावास्तव में सभी प्रोसेसरों में समान मात्रा में काम होता है।

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


"जैसे ही किसी थ्रेड को किसी कार्य के परिणाम की आवश्यकता होती है, यदि कार्य पूरा हो जाता है तो उसे परिणाम मिल सकता है, और नहीं तो यह सुरक्षित रूप से कतार से कार्य को हटा सकता है और आगे बढ़ सकता है और उस कार्य को स्वयं कर सकता है"। क्या आप एक ही सूत्र द्वारा बताए गए कार्य के बारे में बात कर रहे हैं? यदि ऐसा है, तो यह अधिक समझ में नहीं आता अगर उस कार्य को थ्रेड द्वारा निष्पादित किया जाता है जो कार्य को स्वयं करता है?
jmp97

यानी थ्रेड कार्य को शेड्यूल किए बिना, उस कार्य को तुरंत निष्पादित कर सकता है।
jmp97

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

इस सूत्र में लौटने के लिए इतना समय लेने के लिए क्षमा करें। मैं हाल ही में gamedev पर ध्यान नहीं दे रहा हूँ। यह शायद सबसे अच्छा जवाब है, कुंद लेकिन बिंदु और व्यापक है।
j riv

1
आप इस अर्थ में सही हैं कि मैंने I / O-भारी कार्यभार के बारे में बात करने की उपेक्षा की है। प्रश्न की मेरी व्याख्या यह थी कि यह केवल सीपीयू-हेवी वर्कलोड के बारे में था।
जेक मैकआर्थर

30

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

यदि आप किसी मौजूदा गेम को देखना चाहते हैं, तो संभवत: यह कम से कम प्रतिरोध का मार्ग है। हालाँकि, यदि आप कुछ निम्न स्तर के इंजन सिस्टम पर काम कर रहे हैं जो कई गेम या प्रोजेक्ट के बीच साझा किया जा सकता है, तो मैं एक और दृष्टिकोण पर विचार करूँगा।

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

इसलिए मूल रूप से, यदि आप किसी मौजूदा परियोजना के लिए कुछ समानता की ओर देख रहे हैं, तो मैं सबसिस्टम में समानता लाऊंगा। यदि आप समानांतर स्केलेबिलिटी को ध्यान में रखते हुए नए इंजन का निर्माण कर रहे हैं, तो मैं एक नौकरी कतार में देखूंगा।


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

3
एक समुदाय विकी कैसे एक नौकरी कतार और कार्यकर्ता धागे स्थापित करने के लिए अच्छा होगा।
बॉट_बॉट

23

उस सवाल का कोई सबसे अच्छा जवाब नहीं है, क्योंकि यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।

Xbox में तीन कोर हैं और ओवरहेड स्विचिंग समस्या बनने से पहले कुछ थ्रेड्स को हैंडल कर सकते हैं। पीसी काफी अधिक के साथ सौदा कर सकते हैं।

प्रोग्रामिंग में आसानी के लिए बहुत सारे खेल आमतौर पर एकल पिरोए गए हैं। यह अधिकांश व्यक्तिगत खेलों के लिए ठीक है। नेटवर्किंग और ऑडियो के लिए आपके पास एक और चीज़ होने की संभावना होगी।

अवास्तविक में एक गेम थ्रेड है, थ्रेड, नेटवर्क थ्रेड और ऑडियो थ्रेड (यदि मुझे सही याद है)। यह बहुत से वर्तमान-जीन इंजनों के लिए सुंदर मानक है, हालांकि एक अलग रेंडरिंग थ्रेड का समर्थन करने में सक्षम होने के कारण दर्द हो सकता है और इसमें बहुत सारे ग्राउंडवर्क शामिल होते हैं।

Rage के लिए विकसित किया जा रहा idTech5 इंजन वास्तव में किसी भी संख्या में थ्रेड्स का उपयोग करता है, और यह गेम कार्यों को 'जॉब' में तोड़कर करता है जो एक टास्किंग सिस्टम के साथ संसाधित होते हैं। उनका स्पष्ट लक्ष्य औसत गेमिंग सिस्टम कूदता है जब कोर की संख्या अच्छी तरह से उनके खेल इंजन पैमाने है।

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

यह वास्तव में आपके अंतिम लक्ष्य पर निर्भर करता है।


एक शेड्यूलिंग सिस्टम के उल्लेख के लिए +1 .. आमतौर पर सेंटर थ्रेड / सिस्टम कम्युनिकेशन के लिए एक अच्छी जगह :)
जेम्स

क्यों डाउन वोट, डाउनवॉटर?
जेकोरा

12

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

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

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


बस थोड़ा और अधिक सटीक होने के लिए: GPUs थ्रेड पूल का उपयोग नहीं करते हैं इसके बजाय थ्रेड शेड्यूलर को हार्डवेयर में लागू किया जाता है, जो CPU को थ्रेड बनाने और थ्रेड बनाने के लिए नए थ्रेड और स्विच थ्रेड बनाने के लिए बहुत सस्ता पड़ता है, जहां थ्रेड निर्माण और संदर्भ स्विच महंगे हैं। उदाहरण के लिए Nvidias CUDA प्रोग्रामर गाइड देखें।
निल्स

2
+1: यहां सर्वश्रेष्ठ उत्तर। यहां तक ​​कि अगर आपकी रूपरेखा इसकी अनुमति देती है तो मैं थ्रेडपूल (उदाहरण के लिए नौकरी की कतार और श्रमिकों) की तुलना में अधिक अमूर्त निर्माणों का उपयोग करूंगा। शुद्ध धागे / ताले / आदि की तुलना में इस संदर्भ में विचार करना / कार्यक्रम करना बहुत आसान है। प्लस: रेंडरिंग, लॉजिक आदि में अपने गेम को विभाजित करना बकवास है, क्योंकि रेंडर को लॉजिक खत्म होने का इंतजार करना पड़ता है। बल्कि ऐसी नौकरियां बनाएं जो वास्तव में समानांतर में निष्पादित की जा सकती हैं (उदाहरण के लिए: अगले फ्रेम के लिए एक एनपीसी के लिए एआई की गणना करें)।
डेव ओ।

@DaveO। आपका "प्लस" बिंदु इतना सच है।
इंजीनियर

11

आप सही हैं कि सबसे महत्वपूर्ण हिस्सा जहाँ भी संभव हो सिंक्रनाइज़ेशन से बचना है। इसे प्राप्त करने के कुछ तरीके हैं।

  1. अपने डेटा को जानें और इसे अपनी प्रसंस्करण आवश्यकताओं के अनुसार मेमोरी में स्टोर करें। यह आपको सिंक्रनाइज़ेशन की आवश्यकता के बिना समानांतर गणना की योजना बनाने में सक्षम बनाता है। दुर्भाग्य से यह ज्यादातर समय हासिल करने के लिए काफी कठिन है क्योंकि डेटा को अक्सर अप्रत्याशित समय पर विभिन्न प्रणालियों से एक्सेस किया जाता है।

  2. डेटा के लिए स्पष्ट पहुंच-बार परिभाषित करें। आप अपने मुख्य-टिक को x चरणों में अलग कर सकते हैं। यदि आप सुनिश्चित हैं कि थ्रेड एक्स केवल एक विशिष्ट चरण में डेटा पढ़ता है, तो आप यह भी जानते हैं कि इस डेटा को एक अलग चरण में अन्य थ्रेड्स द्वारा संशोधित किया जा सकता है।

  3. अपना डेटा डबल-बफ़र करें। यह सबसे सरल दृष्टिकोण है, लेकिन यह विलंबता को बढ़ाता है, क्योंकि थ्रेड एक्स अंतिम फ्रेम से डेटा के साथ काम कर रहा है, जबकि थ्रेड वाई अगले फ्रेम के लिए डेटा तैयार कर रहा है।

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

कुछ हार्डवेयर बाधाओं को ध्यान में रखने के लिए, आपको अपने हार्डवेयर को कभी भी ओवरबस करने की कोशिश नहीं करनी चाहिए। ओवरस्क्राइब के साथ, मेरा मतलब है कि आपके प्लेटफ़ॉर्म हार्डवेयर थ्रेड्स की तुलना में अधिक सॉफ़्टवेयर थ्रेड्स हैं। विशेष रूप से पीपीसी आर्किटेक्चर (Xbox360, PS3) पर एक टास्क-स्विच वास्तव में महंगा है। यह पूरी तरह से ठीक है अगर आपके पास कुछ थ्रेड ओवरसाइज्ड हैं जो केवल थोड़े समय के लिए ट्रिगर होते हैं (एक बार एक फ्रेम, उदाहरण के लिए) यदि आप पीसी को लक्षित करते हैं, तो आपको ध्यान रखना चाहिए कि कोर की संख्या (या बेहतर HW) -Threads) लगातार बढ़ रहा है, इसलिए आप एक स्केलेबल समाधान खोजना चाहेंगे, जो अतिरिक्त सीपीयू-पावर का लाभ उठाता है। इसलिए, इस क्षेत्र में, आपको अपने कोड को यथासंभव कार्य-आधारित डिज़ाइन करने का प्रयास करना चाहिए।


3

एक आवेदन को फैलाने के लिए अंगूठे का सामान्य नियम: सीपीयू कोर प्रति 1 धागा। क्वाड कोर पीसी पर जिसका अर्थ है 4. जैसा कि नोट किया गया था, XBox 360 में 3 कोर हैं, लेकिन प्रत्येक में 2 हार्डवेयर थ्रेड्स हैं, इसलिए इस मामले में 6 थ्रेड्स। PS3 की तरह एक प्रणाली पर ... उस पर एक अच्छी किस्मत :) लोग अभी भी यह पता लगाने की कोशिश कर रहे हैं।

मैं प्रत्येक सिस्टम को एक स्व-निहित मॉड्यूल के रूप में डिजाइन करने का सुझाव दूंगा जिसे आप चाहें तो थ्रेड कर सकते हैं। यह आमतौर पर मॉड्यूल और इंजन के बाकी हिस्सों के बीच बहुत स्पष्ट रूप से परिभाषित संचार रास्ते होने का मतलब है। मुझे विशेष रूप से रीड-ओनली प्रक्रियाएँ जैसे कि रेंडरिंग और ऑडियो के साथ-साथ 'क्या हम अभी भी हैं' जैसी प्रक्रियाएँ हैं, जैसे खिलाड़ियों के लिए थ्रेडिंग के लिए प्लेयर इनपुट पढ़ना। AttackingHobo द्वारा दिए गए उत्तर को छूने के लिए, जब आप 30-60fps का प्रतिपादन कर रहे हों, यदि आपका डेटा दूसरी तारीख से 1 / 30th-1/60 वां है तो यह वास्तव में आपके गेम के उत्तरदायी अनुभव से अलग नहीं होने वाला है। हमेशा याद रखें कि एप्लिकेशन सॉफ़्टवेयर और वीडियो गेम के बीच मुख्य अंतर सब कुछ 30-60 बार एक सेकंड में कर रहा है। हालांकि उसी नोट पर,

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


2
Xbox360 में 2 हार्डवेयरथ्रेड्स प्रति कोर हैं, इसलिए थ्रेड्स की इष्टतम संख्या 6 है
डार्थकॉडर

आह, +1 :) मैं हमेशा 360 और ps3 के नेटवर्किंग क्षेत्रों तक ही सीमित था, hehe :)
जेम्स

0

मैं एक धागा प्रति लॉजिकल कोर (शून्य से एक, मेन थ्रेड के लिए खाता बनाता हूं, जो संयोगवश रेंडरिंग के लिए जिम्मेदार है, लेकिन अन्यथा वर्कर थ्रेड के रूप में भी कार्य करता है)।

मैं एक फ्रेम भर में इनपुट डिवाइस ईवेंट को रियलटाइम में इकट्ठा करता हूं, लेकिन फ्रेम के अंत तक उन्हें लागू नहीं करता: अगले फ्रेम में उनका प्रभाव होगा। और मैं (पुराने राज्य) बनाम अद्यतन (नए राज्य) के प्रतिपादन के लिए एक समान तर्क का उपयोग करता हूं।

मैं बाद में एक ही फ्रेम में असुरक्षित ऑपरेशन को टालने के लिए परमाणु घटनाओं का उपयोग करता हूं, और मैं एक मेमोरी क्यू को लागू करने के लिए एक से अधिक ईवेंट कतार (नौकरी की कतार) का उपयोग करता हूं, जो बिना लॉक किए या प्रतीक्षा किए, संचालन के आदेश के बारे में एक आयरन-क्लैड गारंटी देता है। (नौकरी प्राथमिकता के क्रम में मुफ्त समवर्ती कतारें)।

यह उल्लेख करना उल्लेखनीय है कि कोई भी नौकरी एक ही प्राथमिकता कतार या उच्चतर (जो फ्रेम में बाद में सेवा की जाती है) के लिए सबजॉर्बर (जो कि महीन हो, और परमाणु से संपर्क कर सकती है) जारी कर सकती है।

यह देखते हुए कि मेरे पास तीन ऐसी कतारें हैं, एक को छोड़कर सभी धागे संभावित रूप से प्रति फ्रेम तीन बार स्टाल कर सकते हैं (जबकि मौजूदा प्राथमिकता स्तर पर जारी सभी बकाया नौकरियों को पूरा करने के लिए अन्य धागे की प्रतीक्षा कर रहे हैं)।

यह थ्रेड निष्क्रियता का एक स्वीकार्य स्तर लगता है!


मेरा फ्रेम MAIN से शुरू होता है, जो पिछले फ्रेम के अपडेट पास से OLD STATE प्रदान करता है, जबकि अन्य सभी थ्रेड तुरंत NEXT फ्रेम स्टेट की गणना करना शुरू कर देते हैं, मैं फ्रेम में एक पॉइंट तक डबल बफर स्टेट चेंज के लिए इवेंट्स का उपयोग कर रहा हूं, जहां कोई भी नहीं पढ़ रहा है ।
होमर

0

मैं सामान्य रूप से एक मुख्य थ्रेड (स्पष्ट रूप से) का उपयोग करता हूं और मैं हर बार एक धागा जोड़ूंगा जिसमें मुझे लगभग 10 से 20 प्रतिशत का प्रदर्शन ड्रॉप होता है। इस तरह की एक बूंद को कम करने के लिए मैं दृश्य स्टूडियो के प्रदर्शन टूल का उपयोग करता हूं। सामान्य घटनाएँ (संयुक्त राष्ट्र) नक्शे के कुछ क्षेत्रों को लोड कर रही हैं या कुछ भारी गणनाएं कर रही हैं।

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