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