2015-06-26 10 views
5

मैं वर्तमान में QT3 से Qt5 तक ओपन-सोर्स समाधान (अल्बट्रॉस एटीएम समाधान http://www.albatross.aero/) पोर्ट कर रहा हूं। अल्बट्रॉस एक हवाई यातायात दर्शक है जिसके लिए बहुत अच्छे प्रदर्शन की आवश्यकता है। ऐसे कई मुद्दे हैं जिन्हें मैं प्रबंधित करने में सक्षम हूं लेकिन प्रदर्शन भाग नहीं।क्यूटी: Qt5 में बिटबल्ट के लिए वैकल्पिक विंडोज

डिस्प्ले आर्किटेक्चर bitblt कमांड पर रहता है जो पहली बार एक पिक्समैप को दूसरे में कॉपी करता है और आखिर में पिक्समैप को स्क्रीन पर कॉपी करता है।

यहाँ (कार्य और performant) Qt3 प्रदर्शन कोड है:

void CAsdView::paintEvent (QPaintEvent * Event) 
{ 
    QRect rcBounds=Event->rect(); 

    QPainter tmp; 

    for (int lay=0;lay<(int)m_RectTable.size();lay++) //For each drawing layer (there are 3) 
    { 

     if (!m_RectTable[lay].isEmpty()) 
     { 
      if (lay!=0) 
       bitBlt(m_BitmapTable[lay],m_RectTable[lay].left(),m_RectTable[lay].top(),m_BitmapTable[lay-1],m_RectTable[lay].left(),m_RectTable[lay].top(),m_RectTable[lay].width(),m_RectTable[lay].height(),CopyROP); //m_BitmapTable is a QVector< QPixmap* >, m_RectTable is a QVector<QRect> 

      tmp.begin(m_BitmapTable[lay]); 

      if (lay==0) 
       tmp.fillRect(m_RectTable[lay], *m_pBrush); 

      OnDraw(&tmp,lay); 
      tmp.end(); 
      m_RectTable[lay].setRect(0,0,-1,-1); 
     } 
    } 
    bitBlt(this, rcBounds.left(), rcBounds.top(),m_BitmapTable[m_LayerNb-1],rcBounds.left(), rcBounds.top(),rcBounds.width(), rcBounds.height(), CopyROP); 
} 

मैं drawPixmap द्वारा bitblt की जगह की कोशिश की है लेकिन जब से मैं बहुत बार स्क्रीन प्रदर्शित करने के लिए प्रदर्शन बहुत बुरा कर रहे हैं।

यहाँ नए Qt5 कोड है:

void CAsdView::paintEvent (QPaintEvent * Event) 
{ 
    QRect rcBounds=Event->rect(); 
    QPainter tmp; 

    for (int lay=0;lay<(int)m_RectTable.size();lay++) 
    { 
     if (!m_RectTable.at(lay).isEmpty()) 
     {  
      tmp2.begin(m_BitmapTable[lay]); 

      if (lay != 0) 
      { 
       tmp.drawPixmap(m_RectTable[lay].left(), m_RectTable[lay].top(), *m_BitmapTable.at(lay - 1), m_RectTable[lay].left(), m_RectTable[lay].top(), m_RectTable[lay].width(), m_RectTable[lay].height());//TOCHECK 
       m_BitmapTable[lay] = m_BitmapTable[lay - 1].copy(m_RectTable[lay]); 
      } 

      if (lay==0) 
       tmp.fillRect(m_RectTable.at(lay), *m_pBrush); 

      OnDraw(&tmp, lay); 
      tmp.end(); 
      m_RectTable[lay].setRect(0, 0, -1, -1); 
     } 
    } 
    tmp.begin(this); 
    tmp.drawPixmap(rcBounds.left(), rcBounds.top(), m_BitmapTable.at(m_LayerNb - 1), rcBounds.left(), rcBounds.top(), rcBounds.width(), rcBounds.height()); 
    tmp.end(); 
} 
  • परतों के लिए, वहाँ 3 परतें हैं। परत 0 सबसे गहरा (पृष्ठभूमि) है, परत 2 उच्चतम है। इस कॉन्फ़िगरेशन का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि स्क्रीन के शीर्ष पर वायु यातायात हमेशा प्रदर्शित होता है।

  • OnDraw विधि, ड्रॉ परत के आधार पर, तत्वों है कि पिछले paintEvent के बाद से बदल गया है

क्यू: आप कैसे मैं करने के लिए इस paintEvent विधि सुधार सकता है पर किसी भी विचार है Geta अच्छा व्यवहार वापस और Qt5 के साथ फिर से अच्छा प्रदर्शन है?

+0

इंटरमीडिएट बिटमैप ब्लिट चरण क्यों आवश्यक था? पारदर्शिता प्रदान करने के लिए? – UmNyobe

+0

@UmNyobe यह पूरी स्क्रीन सामग्री को याद रखने के लिए हमेशा अंतिम परत के पिक्समैप को संग्रहीत करता है। यह केवल उस स्क्रीन के तत्व को रखने के लिए समाधान से बचाता है जो बदल गया है। यदि इस समाधान का उपयोग किया गया था, तो परतों के बीच कुछ डिस्प्ले और रीफ्रेश समस्याएं हो सकती हैं (उदाहरण के लिए परत 2 के बाद परत 1 प्रदर्शित करें और कीमती जानकारी खोना)। हमेशा पूरी परत रखने से हमें यह सुनिश्चित करने की अनुमति मिलती है कि खींचा जा रहा है सही है। –

उत्तर

2

मुझे यहां समस्या मिली।

drawPixmap/drawImage Qt4/Qt5 में बिटब्लेट के लिए सबसे अच्छा विकल्प है। दुर्भाग्यवश मुझे QPixmap के स्केल() विधि के साथ कुछ समस्याएं थीं (कोड के दूसरे भाग में उपयोग नहीं किया गया ...) जो मुझे खराब परिणाम देता है। मुझे pixmap.resize() से pixmap.scaled() तक जाना पड़ा और मैंने यहां एक गलती की।

मैंने इसे बदल दिया और अब मुझे स्पष्ट रूप से एक अच्छा अच्छा परिणाम मिला है। तो मेरे जैसे ऐसे लोगों के लिए जो अभी भी सोच रहे हैं, बिट्टब्लेट के लिए क्यूटी में सबसे अच्छा विकल्प एक क्यूपेन्टर के साथ drawPixmap है।

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