2010-06-23 17 views
7

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

मुझे कितनी जल्दी रेड्रॉप्स होने पर पेंट करने के लिए निम्न गुणवत्ता वाली छवि का उत्पादन करना चाहिए (?

यह एक रूपों-डिजाइनर की तरह आवेदन है कि मालिक ड्राइंग का गहन उपयोग करता है: इस मैं प्रदर्शन को बढ़ाने के लिए काम कर सकते हैं के लिए इसी तरह अन्य रणनीतियों

अतिरिक्त जानकारी कर रहे हैं (या नकली वृद्धि प्रदर्शन।)। यह अच्छी तरह से काम करता है लेकिन क्लाइंट क्षेत्र में आयत में तीन या चार से अधिक छवियों को चित्रित करने की आवश्यकता होने पर नीचे गिरना शुरू होता है। (अंतिम उपयोगकर्ताओं को विभिन्न प्रकार के तत्व बनाने की इजाजत है, जिनके चित्र चित्रों पर सबसे भारी टोल लेते हैं।)

मैं DrawImageUnscaled GDI + विधि का उपयोग कर छवियों को आकर्षित करने के लिए उपयोग कर रहा हूं जो DrawImage से अधिक कुशल होने वाला है लेकिन प्रदर्शन प्रोफाइलिंग शो कि DrawImageUnscaled अभी भी बाधा है। मुझे लगता है कि मेरा एकमात्र सहारा कम आकर्षित करने के चालाक तरीकों से आना है।

पीएस इस मुद्दे से संबंधित एक पिछले प्रश्न ने मुझे टम्बलवेड बैज अर्जित किया है, इसलिए मैं एक और दृष्टिकोण ले रहा हूं: How to increase performance over GDI's DrawImage(Unscaled)?

उत्तर

3

प्रतीक्षा करें - आप यहां कम लटकते फल के टुकड़े से चूक गए हैं। संभवतः वे फिर से आकार के संचालन के दौरान छवि को फिर से नहीं हटा रहे हैं। वे StretchBlt का उपयोग कर वीडियो रैम में मौजूदा छवि का आकार बदल रहे हैं - जिसे वीडियो ड्राइवर/हार्डवेयर द्वारा बहुत तेज़, तेज़ होने के लिए अनुकूलित किया जा सकता है, इससे पहले कि आप कभी भी कम गुणवत्ता वाली छवि को फिर से चला सकें।

रणनीति:
-image वस्तुओं,
छवि वस्तु की -repaint ड्रॉ पूर्ण गुणवत्ता
छवि के -repaint अंतिम स्थिति
खींच -during अद्यतन करता अंतिम स्थिति/आकार (रेक्ट) के लिए सदस्य चर है ऐसा करते हैं:
* अंतिम स्थिति/आकार से करने के लिए StrechBlt वर्तमान स्थिति/आकार
* अद्यतन अंतिम स्थिति/आकार
* यदि कुछ और की तुलना में सेकेंड। ड्राइंग, और/या> .2s अंतिम माउस चाल के बाद से, एक नई पूर्ण-गुणवत्ता वाली छवि प्राप्त करने के लिए पुनर्विचार को कॉल करें (केवल अमान्य नहीं - अब आप इसे चाहते हैं)। अगर आप अन्य ऑब्जेक्ट्स से ओवरलैप का पता लगाते हैं (

नमूना कोड मैं एक ऐप में उपयोग करता हूं जो कुछ ऐसा करता है (एक ज़ूम-इन प्रभाव जो खिड़की को आकार देता है जिसमें 100 ऑब्जेक्ट्स हो सकते हैं - एक iPad डेमो केवल चिकनी) की तरह दिखता है:

Declare Function StretchBlt Lib "gdi32.dll" _ 
    (ByVal hdcDest As IntPtr, _ 
    ByVal nXOriginDest As Integer, _ 
    ByVal nYOriginDest As Integer, _ 
    ByVal nWidthDest As Integer, _ 
    ByVal nHeightDest As Integer, _ 
    ByVal hdcSrc As IntPtr, _ 
    ByVal nXOriginSrc As Integer, _ 
    ByVal nYOriginSrc As Integer, _ 
    ByVal nWidthSrc As Integer, _ 
    ByVal nHeightSrc As Integer, _ 
    ByVal dwRop As Int32) As Boolean 

    Using g As Graphics = f.pb.CreateGraphics 
     ' parm of True says draw plain view - no text = looks bad Zooming. 
     f.DrawAll(g, True) 
     For i As Integer = iSteps To 1 Step -1 
      Dim HDC1 As IntPtr = g.GetHdc 
      Try 
       ' Size of bite will not be right, but by re-adjusting 
       ' with each iteration, it will make it to full-screen. 
       ' Looks as good as having it right to start with, only much easier. 
       TopBite = objTop \ i 
       BottomBite = h - ((h - objBottom) \ i) 
       ' Stretch/move the stuff. 
       StretchBlt(HDC1, 0, 0, w - LeftBite, h, _ 
        HDC1, LeftBite, TopBite, w - LeftBite, BottomBite - TopBite, 13369376) 
       ' Calculate where MyEntry would be after each stretch. Then the Bite 
       ' size calcs above will ensure its closer next time. 
       SimulateStretch(objTop, objBottom, TopBite, BottomBite, h) 
      Finally 
       g.ReleaseHdc(HDC1) 
      End Try 
      ' Clear exposed/invalid area to the right. 
      g.FillRectangle(br, w - LeftBite, 0, LeftBite, h) 
      ' Sleep will make Swells close in duration between small/big window. 
      ' (Can I actually sleep this short of a time?) 
      System.Threading.Thread.Sleep(5) 
     Next 
    End Using 
बेशक

किसी यह itty- छोटे छवि और फिर आकार वापस ऊपर है, यह सुपर कम गुणवत्ता वाले और pixellated हो जाएगा - तो आप कभी कभी का एक समझदारी भरा algorythm उपयोग कर सकते हैं आकार बदलने पर mousedrag के दौरान असली onpaint आग।

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

+0

बेहतर गुणवत्ता वाले डब्ल्यू/कम प्रदर्शन के लिए, आप स्मृति एचडीसी में मुख्यालय छवि से strechblt करने में सक्षम हो सकते हैं, लेकिन मैंने कभी नहीं किया, ramifications को नहीं पता। – FastAl

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