2011-05-28 8 views
13

नीचे दिए गए कोड स्निपेट के साथ मैं 100,000 आयत के साथ एक दृश्य बना देता हूं।
प्रदर्शन ठीक है; दृश्य में कोई देरी नहीं होती है।QGraphicsScene, आइटम समन्वय प्रदर्शन को प्रभावित करते हैं?

QGraphicsScene * scene = new QGraphicsScene; 
for (int y = -50000; y < 50000; y++) { 
    scene->addRect(0, y * 25, 40, 20); 
} 
... 
view->setScene(scene); 

और अब 2 टुकड़ा बेकार

for (int y = 0; y < 100000; y++) { 
    scene->addRect(0, y * 25, 40, 20); 
} 

दृश्य तत्वों दृश्य देरी माउस और महत्वपूर्ण घटनाओं पर प्रतिक्रिया करने के लिए, और के 1 छमाही के लिए दूसरे आधे के लिए यह ठीक हो रहा है?! ?

पूर्व दृश्य में sceneRect (x, y, w, h) = (0, -1250000, 40, 2499995) है।
बाद के दृश्य में sceneRect (x, y, w, h) = (0, 0, 40, 2499995) है।

मुझे नहीं पता कि sceneRect प्रदर्शन को प्रभावित क्यों करता है, क्योंकि बीएसपी सूचकांक संबंधित आइटम निर्देशांक पर आधारित है।

क्या मुझे कुछ याद आ रही है? मुझे प्रलेखन, प्लस क्यूटी डेमो 40000 Chips पर किसी भी जानकारी को नहीं मिला, उस विकल्प के कारण बताए बिना, (0, 0) के आसपास के तत्वों को भी वितरित करता है।

// Populate scene 
int xx = 0; 
int nitems = 0; 
for (int i = -11000; i < 11000; i += 110) { 
    ++xx; 
    int yy = 0; 
    for (int j = -7000; j < 7000; j += 70) { 
     ++yy; 
     qreal x = (i + 11000)/22000.0; 
     qreal y = (j + 7000)/14000.0; 
     ... 
+1

मेरा पहला अनुमान दृश्य रेक्ट का पुनर्मूल्यांकन है। क्या होता है यदि आप आइटम जोड़ने से पहले sceneRect सेट करते हैं? –

+0

@ स्टीफन, परिणाम वही है। दृश्य दृश्य और स्थैतिक होने के बावजूद प्रतिक्रिया देने में देरी हो रही है। –

+1

वाह, बहुत आश्चर्यजनक। मैंने कुछ परीक्षण चलाए, और ऐसा लगता है कि जब आप 1-50,000 बक्से देख रहे हों तो विजेट केवल तभी हो जाता है। 50.001-100.000 का अर्थ है, सब कुछ चिकनी है। और भी चिंताजनक, अगर मैं 'int (int y = -70000; y <30000; y ++)' के लिए रेंज करता हूं, तो स्क्रॉलिंग -70.000/-20.000 के लिए चिकनी है, -20.000/0 के लिए लगी है, फिर 0/30.000 के लिए फिर से चिकनी है ! – Fezvez

उत्तर

6

मैं तुम्हारे लिए एक समाधान है, लेकिन क्यों यह काम कर रहे है मुझे, पूछ नहीं करने के लिए क्योंकि मैं वास्तव में :-)

QGraphicsScene * scene = new QGraphicsScene; 
// Define a fake symetrical scene-rectangle 
scene->setSceneRect(0, -(25*100000+20), 40, 2 * (25*100000+20)); 

for (int y = 0; y < 100000; y++) { 
    scene->addRect(0, y * 25, 40, 20); 
} 
view->setScene(scene); 
// Tell the view to display only the actual scene-objects area 
view->setSceneRect(0, 0, 40, 25*100000+20); 
+0

हाय फिवो। हां यह काम करता है, अच्छी चाल;) –

+0

बेशक मैं वास्तव में उस व्यवहार के कारण को जानना चाहता हूं। क्यूटी में एक बग, या यह कुछ और है? –

+0

बकाया आपका फिवो है, लेकिन मामला अभी भी खुला है :) –

0

आम मामले के लिए पता नहीं है वादा, डिफ़ॉल्ट अनुक्रमणिका विधि BspTreeIndex ठीक काम करता है। यदि आपका दृश्य कई एनिमेशन और का उपयोग करता है, तो आप धीमे अनुभव कर रहे हैं, आप setItemIndexMethod (NoIndex) को कॉल करके इंडेक्सिंग अक्षम कर सकते हैं। Qt-doc

आप प्रविष्टि से पहले setItemIndexMethod(QGraphicsScene::NoIndex) को कॉल करना होगा:

scene->setItemIndexMethod(QGraphicsScene::NoIndex); 

for (int y = 0; y < 100000; y++) { 
    scene->addRect(0, y * 25, 40, 20); 
} 
//... 
+0

यह वह नहीं है जिसे मैं ढूंढ रहा हूं, रेड ह्यू। सूचकांक को अक्षम करना एक अच्छा विचार नहीं है यदि दृश्य में हजारों आइटम, या लाखों शामिल हैं। मैं जो चाहता हूं वह इस अजीब व्यवहार की जड़ को ट्रैक करना है। इसके अलावा मुझे कोड को तेज़ करने के लिए पहले से ही एक कामकाज पता था, और फिवोस विलाकानिस ने एक और पोस्ट किया था। –

+0

@ निक डंडौलाकिस क्या आपने एक बग रिपोर्ट बनाई है? – Arlen

+0

लेकिन क्या यह एक बग है? यह डिजाइन द्वारा किया जा सकता है। वैसे भी, एक रिपोर्ट बनाना एक अच्छा विचार है। –

0

यह float साथ परिशुद्धता की कमी के कारण हो सकता है। 32 बिट फ्लोट में 23 बिट मंटिसा (या महत्व और), 1 बिट साइन और 8 बिट एक्सपोनेंट है। यह वैज्ञानिक नोटेशन की तरह है। आपके पास 23 "महत्वपूर्ण अंक" हैं (वास्तव में एक अंतर्निहित अग्रणी 1 के कारण 24) और 2^एक्सप का एक्सपोनेंट जहां एक्सपोनेंट -126 से 127 तक हो सकता है (अन्य का उपयोग आपको NaN और Inf जैसी चीजें देने के लिए किया जाता है)। तो आप वास्तव में बड़ी संख्या में 2^24 * 2^127 का प्रतिनिधित्व कर सकते हैं लेकिन इस तरह के फ्लोट के लिए निकटतम फ़्लोटिंग पॉइंट नंबर (2^24-1) * 2^127 या 170 अरब बिलियन बिलियन बिल दूर है। यदि आप इस तरह की संख्या में एक छोटी राशि (1000 की तरह) जोड़ने की कोशिश करते हैं तो यह नहीं बदलेगा। इसका प्रतिनिधित्व करने का कोई तरीका नहीं है।

यह कंप्यूटर ग्राफिक्स में महत्वपूर्ण हो जाता है क्योंकि आपको अपने कुछ महत्वपूर्ण अंकों को एक आंशिक भाग बनाने के लिए छोड़ दिया जाना चाहिए। जब आपका दृश्य 1250000.0 तक चलता है तो आप उसमें 0.1 जोड़ सकते हैं और 1250000.1 प्राप्त कर सकते हैं। यदि आप 2500000.0 + 0.1 लेते हैं तो आपको 2500000.0 मिलते हैं। समस्या किसी भी स्केलिंग या रोटेशन द्वारा बढ़ी है जो होता है। यदि आप वास्तव में उन निर्देशांकों तक पहुंचते हैं और अपने दृश्य को देखते हैं तो यह स्पष्ट दृश्य समस्याओं का कारण बन सकता है।

0 सहायता के आसपास केंद्रित क्यों है? क्योंकि फ्लोटिंग पॉइंट प्रस्तुति में एक अलग साइन बिट है।फ्लोटिंग पॉइंट में (0xx) से (-x, + x) के बीच "अधिक संख्याएं" हैं। यदि मैं सही हूं तो यह भी काम करेगा यदि आपने बस अपना पूरा दृश्य 1/2 से घटाया है। इससे दूसरे छोर पर परिशुद्धता के लिए इसे छोड़कर सबसे महत्वपूर्ण बिट नीचे चला जाता है।

इससे खराब प्रदर्शन क्यों होगा? मैं केवल क्यूटी स्रोत को पढ़ने के बिना अनुमान लगा सकता हूं, लेकिन स्थान के आधार पर वस्तुओं को संग्रहीत करने के लिए डेटा संरचना पर विचार करें। अगर आपको दो ऑब्जेक्ट्स ओवरलैप नहीं करते हैं तो आपको ऐसा करने की ज़रूरत नहीं है, जो आपको सटीक होने की हानि के कारण दो ऑब्जेक्ट स्पर्श (या ओवरलैप) करना पड़ सकता है?

+0

हाय बेन। मैंने 2.500.000 से 1.000.000 तक और यहां तक ​​कि 500.000 तक पैमाने को कम करके अपनी धारणा की कोशिश की लेकिन इसमें कोई सुधार नहीं हुआ है। मुझे लगता है कि समस्या (या बग?) परिशुद्धता से संबंधित नहीं है, लेकिन QGraphicsView व्यूपोर्ट को रीफ्रेश/अपडेट किए जाने पर दृश्य ऑब्जेक्ट्स को क्लिप करने के लिए QT QGraphicsView QGraphicsScene के BSP अनुक्रमणिका का उपयोग करता है, इसके साथ मुख्य रूप से करना है। –

+0

हाय @ बेन और @ फिवो। मैंने बीएसपी के कार्यान्वयन की जांच की, और फ्लोट परिशुद्धता मामला प्रतीत नहीं होता है। क्यूटी का बसपा बस दृश्य/क्षेत्र को आइटम की स्थिति के बिना एन * एन बाल्टी में विभाजित करता है! शायद यह वास्तव में 'QGraphicsView' में एक बग है। –

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