2012-10-01 16 views
6

अरे दोस्तों मैं libGDX के साथ एक गेम बनाने पर काम कर रहा हूं और मैं वास्तव में गेम को थ्रेड करना चाहता हूं इसलिए मैं अलग-अलग धागे पर एक पेंट लूप और लॉजिक लूप चला रहा हूं जैसे कि आप एक साधारण जावा स्विंग गेम बनाते हैं पेंटकंपोनेंट लूप और रननेबल रन लूपlibGDX में जावा थ्रेड

मुझे सी में थ्रेडिंग के साथ अनुभव किया गया है लेकिन जावा में इतना नहीं है कि मैं एक धागा बनाने में सक्षम था, जो थ्रेड को बढ़ाता था और फिर रन बना रहा था लूप

लेकिन रन लूप बनाने का बिंदु प्रत्येक स्क्रीन को तर्कसंगत रूप से तर्क की गणना करने की अनुमति देना था ताकि मैं किसी प्रकार की सार तत्वों की कक्षा की आवश्यकता समाप्त कर सकूं जिसमें कस्टम थेरे विज्ञापन वर्ग कार्यान्वित

इम अगर वहाँ इस स्थिति

उत्तर

11

libGDX लाइब्रेरी ओपनजीएल संदर्भ अद्यतनों के लिए पहले से ही एक अलग रेंडर थ्रेड चलाती है। (: पी मोटे तौर पर) http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

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

आपका मुख्य खेल वस्तु पर ApplicationListener.render() विधि हर स्क्रीन रिफ्रेश के लिए एक बार इस सूत्र प्रस्तुत करना द्वारा सक्रिय किया जाएगा (इसलिए यह 60hz के बारे में होना चाहिए), तो बस इस विधि के अपने कार्यान्वयन में अपने पाश प्रस्तुत करना के शरीर डाल ।

आप में dispose विधि में इसे साफ़ करना सुनिश्चित करें) में एक अतिरिक्त पृष्ठभूमि थ्रेड (उदा।, गेम तर्क के लिए) बना सकते हैं। render थ्रेड के अलावा, मुझे नहीं लगता कि पूर्व में मौजूद किसी भी थ्रेड गेम तर्क के लिए सही जगह होगी।

धागे के बीच संचार के लिए, आप मौजूदा जावा सिंक्रनाइज़ेशन दृष्टिकोणों में से किसी एक का उपयोग कर सकते हैं। मैंने बैकग्राउंड थ्रेड पर अनुरोध भेजने के लिए जावा का ArrayBlockingQueue<> उपयोग किया है। और मैंने Gdx.app.postRunnable() का उपयोग किया है ताकि मेरे पृष्ठभूमि धागे को रेंडर थ्रेड में डेटा धक्का दिया जा सके (ऐसे रननेबल्स अगले फ्रेम पर चल रहे हैं, render() से पहले)।

+0

शायद मैं अस्पष्ट था मुझे पता है कि प्रस्तुत करना एक धागा है और यह लगातार loops।लेकिन मैं यह देखने के लिए देख रहा था कि क्या मेरे पास वास्तविक गेम तर्क के लिए एक अलग धागा हो सकता है। अगर libGDX प्रस्तुत करने के लिए एक नया धागा बनाता है तो मैं अभिभावक या मूल धागे को कैसे एक्सेस करूं? – Mintybacon

+0

@Mintybacon मैंने इंटर-थ्रेड संचार विकल्पों के बारे में कुछ और विवरणों के साथ अपना उत्तर अपडेट किया है। उम्मीद है की यह मदद करेगा। –

0

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

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

+0

धन्यवाद बीमार ThreadPoolExecutor में देखो और आप वापस आ जाओ! – Mintybacon