ड्राइंग करते समय प्रदर्शन मैं एक आईओएस ऐप पर काम कर रहा हूं जो डेटा को लाइन-ग्राफ के रूप में देखता है। ग्राफ को CGPath
के रूप में पूर्णस्क्रीन कस्टम UIView
में खींचा गया है और इसमें अधिकतम 320 डेटा-पॉइंट शामिल हैं। डेटा को अक्सर अद्यतन किया जाता है और ग्राफ को तदनुसार फिर से खींचा जाना चाहिए - 10/सेकंड की रीफ्रेश दर अच्छी होगी।अक्सर CGPaths
अभी तक इतना आसान है। ऐसा लगता है कि, मेरे दृष्टिकोण में बहुत सी CPU समय लगता है। आईफोन 4 एस पर प्रक्रिया के लिए 45% सीपीयू लोड में 320 सेगमेंट के साथ ग्राफ़ को दो बार प्रति सेकंड पर रीफ्रेश करना।
शायद मैं हुड के नीचे ग्राफिक्स-काम को कम से कम समझता हूं, लेकिन मेरे लिए सीपीयू लोड उस कार्य के लिए बहुत कुछ लगता है।
नीचे मेरा drawRect()
फ़ंक्शन है जो प्रत्येक बार डेटा का एक नया सेट तैयार होने पर बुलाया जाता है। N
अंक की संख्या रखता है और points
एक CGPoint*
वेक्टर है जो आकर्षित करने के लिए निर्देशांक के साथ है।
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
// set attributes
CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);
CGContextSetLineWidth(context, 1.f);
// create path
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, NULL, points, N+1);
// stroke path
CGContextAddPath(context, path);
CGContextStrokePath(context);
// clean up
CGPathRelease(path);
}
मैं पहली बार वर्तमान परत के लिए यह here सुझाव के रूप में जोड़ने से पहले एक ऑफ़लाइन CGContext के लिए पथ प्रतिपादन की कोशिश की, लेकिन किसी भी सकारात्मक परिणाम के बिना। मैं सीधे कैलियर को एक दृष्टिकोण ड्राइंग के साथ झुका हुआ था लेकिन इससे भी कोई फर्क नहीं पड़ता।
कोई सुझाव है कि इस कार्य के लिए प्रदर्शन में सुधार कैसे करें? या सीपीयू के लिए प्रतिपादन बस इतना अधिक काम है जिसे मैं महसूस करता हूं? ओपनजीएल कोई समझ/अंतर करेगा?
धन्यवाद/Andi
अद्यतन: मैं भी UIBezierPath
बजाय CGPath
उपयोग करने की कोशिश। यह पोस्ट here एक अच्छा स्पष्टीकरण देता है कि इससे मदद क्यों नहीं मिली। ट्वीविंग CGContextSetMiterLimit
एट अल। भी बड़ी राहत नहीं मिली।
अद्यतन # 2: मैं अंततः ओपनजीएल में स्विच किया। यह एक खड़ी और निराशाजनक सीखने की वक्र थी, लेकिन प्रदर्शन बढ़ावा केवल अविश्वसनीय है। हालांकि, कोरग्राफिक्स एंटी-एलाइजिंग एल्गोरिदम ओपनजीएल में 4x-multisampling के साथ हासिल किए जा सकने वाले चीज़ों की तुलना में एक अच्छा काम करते हैं।
आपका रंग एक निरंतर है:
यहां कुछ नमूना कोड मैंने लिखा है, यह किसी के लिए एक अच्छा प्रारंभिक बिंदु प्रदान करते हैं सकता है। यदि ड्रॉक्ट करें और हर बार एक नया पूछने के बजाए इसका पुन: उपयोग करते रहें तो इसे बाहर ले जाएं। पथ के लिए डितो। चूंकि स्ट्रोकपाथ() "पथ खाली करता है", आप उसी पथ वस्तु का पुन: उपयोग कर सकते हैं। वह क्या बदलता है? – verec
प्रलेखन का दावा है कि पथ खाली हो गया है, लेकिन कम से कम मेरे कोड में यह नहीं है। यह सिर्फ बढ़ता रहता है। रंग के लिए, आपके पास एक बिंदु है। वह बुरा था, लेकिन समाधान नहीं। धन्यवाद। –
आपका मतलब UIBezierPath है, है ना? NSBezierPath केवल मैक पर मौजूद है। –