2012-02-14 18 views
6

मैकोज़ एक्स पर, आप अपनी पसंद के ऑब्जेक्ट को ओपनजीएल प्रस्तुत कर सकते हैं, बस NSOpenGLContext बनाकर और फिर -setView: पर कॉल करके। हालांकि, आप किसी भी समय एक ही ओपनजीएल संदर्भ के साथ एक दृश्य को जोड़ सकते हैं।ओपनजीएल संदर्भ स्विच करें या संदर्भ के बजाय संदर्भ प्रस्तुत करें स्विच करें, क्या बेहतर है?

  1. एक संदर्भ बना सकते हैं और हमेशा दृश्य बदलने, फोन करके: मेरा सवाल है, अगर मैं एक एकल खिड़की के भीतर दो अलग विचारों (या दो संभवतः के भीतर विभिन्न विंडोज़) के लिए ओपन प्रस्तुत करना चाहता हूँ, मुझे दो विकल्प हैं setView हर बार उचित के रूप में मैं दूसरे दृश्य में प्रस्तुत करना चाहता हूं। यह विचार तब भी काम करेगा जब विचार अलग-अलग विंडो या विभिन्न स्क्रीन पर हों।

  2. दो NSOpenGLContext ऑब्जेक्ट्स बनाएं और किसी एक के साथ एक दृश्य को संबद्ध करें। इन दो संदर्भों को साझा किया जा सकता है, जिसका अर्थ है कि अधिकांश संसाधन (जैसे बनावट, बफर इत्यादि) स्मृति के दो बार बर्बाद किए बिना दोनों विचारों में उपलब्ध होंगे। उस स्थिति में, हालांकि, मुझे ओपनजीएल कॉल करने से पहले सही संदर्भ पर -makeCurrentContext पर कॉल करके, प्रत्येक बार जब मैं अन्य दृश्य में प्रस्तुत करना चाहता हूं, तो वर्तमान संदर्भ को स्विच करना होगा।

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

दूसरी तरफ दृश्य को स्विच करना बहुत धीमा हो सकता है, खासकर यदि यह अंतर्निहित रेंडरर को बदलने का कारण बन सकता है; जैसे यदि आपके दो विचार दो अलग-अलग स्क्रीनों पर स्थित दो अलग-अलग विंडो का हिस्सा हैं जो दो अलग ग्राफिक एडेप्टर द्वारा संचालित होते हैं। यहां तक ​​कि अगर रेंडरर परिवर्तन नहीं करता है, मुझे नहीं पता है, तो प्रणाली जब एक दृश्य स्विच बनाने/उदाहरण के लिए render-/फ्रेमबफर वस्तुओं को नष्ट करने की तरह महंगा ओपन सेटअप/सफाई का एक बहुत करता है।

उत्तर

4

मैं शेर, जहां मैं एक कुछ हद तक दुरुपयोग VTK पुस्तकालय, जो अपने आप को पहले से ही बहुत धीमी है के साथ कुछ प्रदर्शन के मुद्दों को हल करने की कोशिश की पर 3 खिड़कियां के बीच स्विच संदर्भ की जांच की।

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

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

धागे को एक सामान्य बाधा जैसे कुछ थ्रेडिंग सामानों का उपयोग करके नियंत्रित किया जा सकता है, जो दोनों धागे सिंक में एकल फ्रेम प्रस्तुत करते हैं (दोनों को फिर से लॉन्च होने से पहले बाधा पर रोक दिया जाता है)। डेटा हैंडलिंग को भी अनलॉक किया जाना चाहिए, जो अन्य थ्रेड थ्रेड को रोकते समय एक थ्रेड में किया जा सकता है।

+0

50 एमएस, क्या वे जीएलसीएन्टेक्स्ट स्विचिंग या लक्ष्य स्विचिंग प्रस्तुत करते हैं? और यदि वे पहले व्यक्ति को संदर्भित करते हैं, तो क्या संदर्भ साझा या साझा नहीं किए गए थे? – Mecki

+0

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

+2

खैर, मैंने एक सिंटेक्टिकल बेंचमार्क द्वारा संदर्भ स्विचिंग ओवरहेड को बेंचमार्क करने का प्रयास किया, जिसमें से प्रत्येक में केवल एक संसाधन (एक बहुत बड़ा बनावट) और बिना किसी लंबित ड्राइंग कॉल के अनछुए संदर्भों का उपयोग किया गया। नतीजा यह था कि प्रति सेकंड लगभग 50'000 संदर्भ स्विच संभव हैं। यह सुंदर hgih लगता है लेकिन नमक के अनाज के साथ लिया जाना चाहिए, ईमानदारी से, यह बेंचमार्क कितना यथार्थवादी है? कौन सा ऐप उस छोटे संसाधनों या कभी लंबित ड्राइंग कॉल नहीं करेगा? तो आपकी संख्या शायद कम से कम अधिक यथार्थवादी से बेहतर है। – Mecki

संबंधित मुद्दे