2011-09-14 7 views
5

मेरे पास कोड की यह पंक्ति है:जावा: ओपनजीएल: जॉगएल: जब मैं डिस्प्ले() विधि को कॉल करता हूं तो दृश्यों के पीछे क्या होता है?

renderableObject.renderObject(gl, glu); 

यह ओपनजीएल द्वारा प्रदान की जा रही वस्तुओं की एक बड़ी सूची की ओर जाता है, हालांकि यह केवल तभी काम करता है जब निम्नानुसार उपयोग किया जाता है:

@Override 
public void display(GLAutoDrawable drawable) 
    {    
     renderableObject.renderObject(gl, glu); 
    } 

अगर मैं बाहर की रेखा को कॉल करता हूं ओवरराइड डिस्प्ले विधि मुझे एक अपवाद मिलता है कि वर्तमान थ्रेड पर कोई ग्लोन्टेक्स्ट नहीं है, असल में अगर मैं इस विधि के बाहर किसी भी ग्ल ड्रॉ कमांड को कॉल करता हूं तो मुझे एक ही अपवाद मिलता है

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

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

तो क्या एक साधारण ग्ल कॉल है जो मैं खुद बना सकता हूं?

उत्तर

2

जैसा कि प्रतीत होता है उतना अजीब, यह जिस तरह से काम करना है।

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

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

आपके लिए विशेष रूप से एक GLContext बनाने और इसे स्वयं चालू करने के तरीके हैं, लेकिन वे शायद ही कभी आवश्यक हैं। यहां दृष्टिकोण का उपयोग करना लगभग हमेशा बेहतर होता है। दृश्यों के पीछे

+1

जॉगएल काम का पूरा ढेर कर रहा है। यह एक जीएलकॉन्टेक्स्ट बना रहा है, और वर्तमान धागे के लिए जीएलकैनवास के लिए इसे चालू कर रहा है। ------- क्या मैं यह खुद नहीं कर सकता? – Troyseph

+0

सेबेस्टियन ट्रॉय, आप कर सकते हैं लेकिन यह वास्तव में तुच्छ नहीं है। आप सख्त न्यूनतम संचालन कर सकते हैं (GLAContxt से GLContext प्राप्त करें और इसे चालू करें) लेकिन ध्यान रखें कि जॉग में बहुत अच्छे क्विर्क और वर्कअराउंड हैं जो सी में देशी सादे ओपनजीएल से या जावा में किसी अन्य बाध्यकारी के साथ बहुत सुरक्षित हैं, सी #, पायथन, ... इसके अलावा, यदि आप कुछ बुरा करते हैं तो अपने प्रदर्शन को बर्बाद करना वास्तव में आसान है। जब मैंने Ardor3D को JOGL 2 पर पोर्ट किया, तो मुझे मेक कंटेंट() को बेकार तरीके से बुलाया गया था, इस कॉल को हटाने से मुझे वी-सिंक बंद होने पर एक बड़ा बढ़ावा मिला। – gouessej