मैं अपने दृश्य में एक बड़ा रास्ता खींच रहा हूं और मैं कुछ प्रदर्शन समस्याओं में भाग रहा हूं। पथ वर्तमान में 32,000 अंक लंबा है, लेकिन मेरा आवेदन कम से कम 128,000 अंक तक स्केल होना चाहिए। मैं वास्तव में पथ के आकार के बारे में कुछ भी नहीं कर सकता, क्योंकि डेटासेट केवल इतना बड़ा है और मुझे पूरे पथ को एक बार में प्रदर्शित करने में सक्षम होना चाहिए और ज़ूम इन करने की आवश्यकता है।ड्राइंग पथ और हार्डवेयर त्वरण
मैं एक नेक्सस 10 का उपयोग कर रहा हूं एंड्रॉइड 4.2 चला रहा है, जिसमें हार्डवेयर त्वरण उन अनुप्रयोगों के लिए डिफ़ॉल्ट रूप से सक्षम है जो इसे स्पष्ट रूप से अक्षम नहीं करते हैं।
dataPath.moveTo(0, offset - (float) data[leftLimit]/ scalingFactor);
for (int i = leftLimit; i < rightLimit; ++i) {
x = (i - leftLimit) * dx;
y = offset - (float) data[i]/ scalingFactor;
dataPath.lineTo(x, y);
}
और फिर onDraw()
विधि में तैयार:
मार्ग का अनुसरण कोड के साथ बनाई गई है (मैं कुछ सेटअप और अन्य अप्रासंगिक भागों छोड़े गए)
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
मैं समय मापा यह हार्डवेयर त्वरण के साथ और बिना adb shell dumpsys gfxinfo
का उपयोग करके अपना विचार खींचने के लिए लेता है, और मेरे आश्चर्य के लिए हार्डवेयर त्वरण बहुत धीमा है:
हार्डवेयर त्वरण के साथ:
हार्डवेयर त्वरण के बिना:
हार्डवेयर त्वरित संस्करण फ्रेम प्रति चारों ओर 200-300 एमएस, सबसे प्रक्रिया चरण में खर्च लेता है। गैर-त्वरित संस्करण लगभग 50 एमएस लेता है, ड्रा चरण में 2/3 और प्रक्रिया चरण में 1/3।
स्पष्ट रूप से हार्डवेयर त्वरण के बिना भी मेरा तेज संस्करण 60 एफपीएस प्राप्त करने में अभी भी धीमा है, या जब मैं बड़े डेटासेट में जाता हूं तो भी मुश्किल से उपयोग करने योग्य होता है।
बिटमैप के पथ को प्रस्तुत करने का विचार और फिर स्क्रीन को फिट करने के लिए केवल उस बिटमैप को बदलने के लिए मेरे मामले में समस्याग्रस्त भी है। मुझे पथ पर बहुत दूर ज़ूमिंग का समर्थन करने की आवश्यकता है, और पथ की गुणवत्ता के बिना ज़ूमिंग को और भी बदतर करने में सक्षम होने के लिए मुझे पथ के बड़े आकार के बिटमैप्स प्रस्तुत करना होगा (और संभवतः स्मृति सीमाओं और बनावट आकार सीमाओं में भाग लेना होगा)। और जब तक ज़ूमिंग करना है तो मुझे या तो पथ के केवल हिस्सों की नई छवियां बनाना होगा, या सीधे पथ को सीधे प्रस्तुत करने के लिए स्विच करना होगा, जो संभवतः फ़्रेमेट से अधिक देरी का कारण बन जाएगा यदि प्रदर्शन अभी भी मेरे पास सही है अभी व।
क्या मैं अब सोच रहा हूँ
- आ रहा है लाइनों/रास्तों बस कुछ GPU में बुरा है और है कि एक हार्डवेयर के लिए कोशिश नहीं करनी चाहिए तेजी लाने, या मैं कुछ गलत होने की संभावना है कि बुरा का कारण बनता है कर रहा हूँ है प्रदर्शन?
- क्या स्वीकार्य प्रदर्शन के साथ ऐसे विशाल पथ खींचने के लिए मैं कुछ भी कर सकता हूं?
ओपनजीएल इस में कैसे ठीक है? –
हार्डवेयर त्वरण ओपनजीएल का उपयोग करता है, जहां तक मैं इसे समझता हूं। लेकिन मुझे यकीन नहीं था कि किस टैग का उपयोग करना है। –
आप इसे कैसे आकर्षित कर रहे हैं? यदि आप GPU के लिए एक समय में 1 बिंदु प्लॉट करते हैं तो आपको शायद खराब प्रदर्शन मिलेगा, लेकिन यदि आप इसे सभी पर बैच करते हैं तो आपको कम से कम सिद्धांत में वृद्धि दिखाई देनी चाहिए। – Automatico