2012-05-16 28 views
23

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

ओपनग्ल खिड़कियां एक खिड़कियों के बच्चे हैं जो एक दूसरे के भाई बहन हैं, एक टैब नियंत्रण में निहित हैं। एक एमडीआई स्टाइल इंटरफ़ेस की तरह, लेकिन यह एक एमडीआई विंडो नहीं है .. प्रत्येक को व्यक्तिगत रूप से आकार दिया जा सकता है। जब तक एयरो सक्षम नहीं होता है तब तक सभी काम प्यारे होते हैं और डीडब्लूएम सक्रिय होता है।

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

मुझे पूरा यकीन है कि यह वास्तव में डीडब्लूएम नहीं है जो वास्तव में इसकी ड्राइंग सतह बैकिंग स्टोर पर ओपनएल सामग्री नहीं रखता है और खिड़की को सही पल पर पुनर्निर्मित नहीं किया जा रहा है।

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

क्या किसी को इसके लिए बेहतर समाधान पता है?

इससे पहले कि किसी को भी पूछता है मैं निश्चित रूप से निम्न कार्य करें:

  • विंडो वर्ग CS_OWNDC
  • WM_ERASEBACKGROUND कुछ नहीं करता है और सही रिटर्न है।
  • डबल बफरिंग सक्षम है।
  • विंडोज़ में WS_CLIPSIBLINGS और WS_CLIPCHILDREN विंडो शैलियों हैं।
  • मेरे आकार बदलने वाले ईवेंट हैंडलर में मैं तुरंत खिड़की को पुनर्निर्मित करता हूं। पिक्सेल प्रारूप डिस्क्रिप्टर में PFD_SUPPORT_COMPOSITION स्थापना

    • :

    मैं कोशिश की है।

  • पेंट हैंडलर में wxPaintDC का उपयोग नहीं करना और :: ValidateRect (hwnd, NULL) को इसके बजाय कॉल करना।
  • WM_NCPAINT हैंडलिंग और DWM एपीआई
  • रंग घटना
  • glFlush और/या glFinish कॉलिंग से पहले और बफर स्वैप के बाद में क्लाइंट क्षेत्र को छोड़कर के माध्यम से ग्राहक क्षेत्र
  • अक्षम करना एनसी रंग को छोड़कर।
  • प्रत्येक पेंट इवेंट (एक परीक्षण के रूप में) पर विंडो को अमान्य कर रहा है - अभी भी झिलमिलाहट!
  • साझा जीएल संदर्भ का उपयोग नहीं कर रहा है।
  • डबल बफरिंग अक्षम करना।
  • GL_FRONT_AND_BACK को

DWM अक्षम करना लेखन एक विकल्प नहीं है।

और जहां तक ​​मुझे पता है कि यह भी एक समस्या है यदि आप OpenGL पर डायरेक्ट 3 डी का उपयोग कर रहे हैं, हालांकि मैंने इसका परीक्षण नहीं किया है क्योंकि यह बहुत सारे काम का प्रतिनिधित्व करता है।

+0

मैं एक MFC एमडीआई एप्लिकेशन और ओपन, जहां MFC नियंत्रण कभी कभी जीएल विंडो में कलाकृतियों आकर्षित छोड़ के साथ इसी तरह की समस्याओं की है। यह तब होता है जब एरो सक्षम होता है। इसी तरह, मुझे एक संतोषजनक समाधान नहीं मिला है। – mcmcc

+0

glReadPixels के साथ पढ़ने के रूप में ओपनएल सामग्री के साथ खिड़की पर ब्लाइटिंग इसे हल करने के लिए प्रकट होता है, लेकिन एक अच्छी विधि होनी चाहिए। – Pete

उत्तर

0

हम्म, हो सकता है आप एक ही मुद्दा में भाग है: यदि आप उपयोग कर रहे हैं 'नई' MFC यह बना सकते हैं और टैब और विंडो Spliter साथ आवेदन करेंगे।

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

इसके अलावा टैब डॉकिंग की अनुमति देते हैं और फिर एक ही समस्या वाले विंडो को विभाजित करते हैं - हटाएं/प्रतिस्थापित करें।

गुड लक, इगोर

+0

कोई भी wxwidgets ऐप नहीं है, या आप mcmcc की टिप्पणी का जवाब दे रहे हैं? मुझे लगता है कि अंतिम मुद्दा यह है कि डीडब्लूएम एक अलग थ्रेड में कंपोजिट कर रहा है। – Pete

+0

मैंने पेंट विधि में अपने सभी ओपनजीएल कॉल को बदलकर एक ही समस्या हल की। मेरे पास सोमवार तक मेरे कोड तक पहुंच नहीं है इसलिए मैं आपको अधिक जानकारी नहीं दे सकता ... कम से कम मैं वीसीएल का उपयोग करता हूं, लेकिन चूंकि इसकी एक ही समस्या यह एक ही समाधान हो सकती है! – Maypeur

2

यह एक longshot है, लेकिन मैं सिर्फ वास्तव में इस एक ही समस्या अपने आप हल

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

हम क्या पाया की वजह से समस्या यह थी:

हम एक RoundRect() कॉल (एक HOLLOW_BRUSH साथ) का उपयोग किया गया था समूह बॉक्स की रूपरेखा आकर्षित करने के लिए। इसे MoveToEx() और LineTo() में बदलने के लिए यह सुनिश्चित करने के लिए कॉल करें कि लाइनों को खींचा जाए और समूह बॉक्स के अंदर कुछ भी नहीं किया जाता है, जीडीआई को अप्रत्याशित रूप से नियंत्रण की पूरी सामग्री को पुन: पेश करने की कोशिश करने से रोक दिया जाता है। यह संभव है कि अमान्यता तर्क में कोई अंतर हो (या हमारे पास इच्छित खोखले ब्रश को लोड करने में किसी भी तरह का बग था)। हम अभी भी जांच कर रहे हैं।

-Noel