2009-02-19 8 views
5

मुझे एक दिनचर्या मिली है जो स्क्रॉल फलक के अंदर एक बेहद बड़े ग्राफ को चित्रित करती है। स्क्रोलपैन में जोड़ने से पहले पेंट करना बहुत बड़ा है - मेनोरी आवश्यकताएं कई गिग होंगी।जावा स्विंग में अजीब पेंट कॉल में मेरे जेएसक्रॉलपेन का परिणाम क्यों है?

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

उदाहरण के लिए अगर मेरे व्यूपोर्ट 245x195 & मैं 3 पिक्सल द्वारा नीचे स्क्रॉल मेरी पेंट दिनचर्या g.getClipBounds() सेट के साथ कहा जाता हो जाता है इस प्रकार है:

java.awt.Rectangle[x=0,y=195,width=245,height=3] 
java.awt.Rectangle[x=0,y=3,width=245,height=195] 

... क्योंकि मैं रंग दिनचर्या के भीतर प्रस्तुत करना इस झिलमिलाहट खड़ी कर रहा है (मैं जितना तेज़ कर सकता हूं, उतना तेज़ कर सकता हूं, लेकिन मुझे लगता है कि देरी का थोड़ा सा हिस्सा है)। प्रश्न:

  1. किसी को भी 2 रंग कॉल को रोकने के लिए कैसे पता है? यह सादा-जेन जेएसक्रॉलपेन सामान है जो मैं यहां कर रहा हूं - मेरे पास एक घटक है, मैं इसे स्क्रॉलपैन में जोड़ता हूं, मैं स्क्रॉलपेन को मूल घटक में जोड़ता हूं। आप पहली छवि स्क्रॉलिंग डेमो @the swing tutorial में भी इस व्यवहार को देख सकते हैं।

  2. यदि # 1 का उत्तर 'नोप' है: क्या कोई इस से निपटने के लिए एक अच्छा तरीका सोच सकता है? क्या मुझे किसी प्रकार के छवि बफर को पेंट करना चाहिए, हालिया पेंट कॉल को ट्रैक करें & जहां संभव हो वहां छवि कॉपी करें? मैं कल्पना नहीं कर सकता कि यह पुनः प्रतिपादन की तुलना में बहुत तेज़ है, लेकिन किसी अंतर्दृष्टि की सराहना की गई :-)

उत्तर

4

मैं .NET दुनिया में इस समस्या में भाग गया हूं। डबल बफरिंग आपकी समस्या का समाधान करना चाहिए।

यदि आप स्क्रीन पर दिखाए गए सतह पर सीधे प्रतिपादन कर रहे हैं, तो वास्तव में "दिखाए जाने" पर आपका कोई नियंत्रण नहीं होता है। आम तौर पर क्या होता है: आप प्रतिपादन शुरू करते हैं, स्क्रीन पर अभी तक समाप्त नहीं हुई छवि प्रदर्शित की जा रही है, आप प्रतिपादन पूर्ण करते हैं, और फिर अंत में स्क्रीन पर दिखाया जाता है।

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

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

+0

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

+0

ठीक है, डबल बफरिंग अभी भी खेल में आ सकती है। बस एक ऑफ-स्क्रीन सतह (दृश्य भाग का आकार) पर आपको जो चाहिए उसे प्रस्तुत करें। और फिर जब आप पूरा कर लेंगे, तो पूरी छवि को अपनी डिस्प्ले सतह पर खींचें, एक में गिरावट आई है। – colithium

+0

असल में, यह काम करता है।धन्यवाद :-) स्क्रॉलिंग एक धीमी गति से धीमी है, लेकिन झिलमिलाहट चली गई है। क्षमा करें मुझे इसे पहले नहीं मिला - मेरी मूर्खता आपके दृढ़ता के लिए कोई मेल नहीं थी ;-) –

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