मैं एक पेंटिंग ऐप पर काम कर रहा हूं जो प्रतिपादन के लिए कोरग्राफिक्स का उपयोग करता है। मेरी समस्या है, प्रदर्शन के लिए, मैं अद्यतनों को केवल उस दृश्य के कुछ हिस्सों तक सीमित करने की कोशिश कर रहा हूं जो बदल गए हैं। इसके लिए, मैं setNeedsDisplayInRect का उपयोग करता हूं: लेकिन कभी-कभी दृश्य अपनी संपूर्ण सामग्री को अपडेट करता है, जिससे स्टटरिंग होती है। यह तीसरी पीढ़ी के आईपैड पर विशेष रूप से स्पष्ट है, लेकिन यह सिम्युलेटर और आईपैड 2 में भी कम डिग्री तक होता है। मैं इस व्यवहार को हटाने की कोशिश कर रहा हूं।setNeedsDisplayInRect: पूरे दृश्य को अपडेट करने का कारण बनता है
समस्या का प्रदर्शन करने के लिए, मैंने एक्सकोड में टेम्पलेट का उपयोग करके एक सरल "एकल दृश्य" प्रोजेक्ट बनाया। एक कस्टम UIView सबक्लास बनाया गया है जिसे मैंने xib फ़ाइल में दृश्य नियंत्रक के दृश्य के रूप में सेट किया है।
जोड़ा इस UIViewController के लिए:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Asks that the view refreshes a smal rectangle
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 20, 20)];
}
MyView को यह जोड़ा (मेरे कस्टम दृश्य):
- (void)drawRect:(CGRect)rect
{
// Just log what is being updated
NSLog(@"%@", NSStringFromCGRect(rect));
}
और बस हो गया। यदि मैं ऐप को तीसरे दस आईपैड (वास्तविक डिवाइस) पर चलाता हूं, तो लॉग समय-समय पर (जैसे अक्सर) अपने एंटीरर्टी में खुद को पुनर्निर्मित करने का दृश्य दिखाते हैं। यह बहुत निराशाजनक है और मैं विचारों से बाहर हूं
अपडेट: यहां कुछ लॉग हैं। यह निश्चित रूप से पूर्ण दृश्य को कभी-कभी अपडेट किया जा रहा है। मैं इसे पूरी तरह से रोकने के लिए कोशिश कर रहा हूँ लेकिन समझ नहीं सकता कैसे करने के लिए ...
2012-05-04 08:34:01.851 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.184 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.197 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.215 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.226 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.242 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.258 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.274 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.290 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.306 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.322 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.338 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.354 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.371 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.387 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.403 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.419 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.439 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.457 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
इसके अलावा, अगर मैं 10s या तो और फिर से शुरू से अधिक के लिए आगे बढ़ बंद करो, यह निश्चित रूप से यह होता है बहुत लगातार:
2012-05-04 08:34:33.305 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:33.321 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:35:00.202 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.221 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.234 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.251 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
मेरे मामले में, जब drawRect setNeedsDisplayInRect के बाद ** पहली बार ** कहा जाता है, रेक्ट पूर्ण सीमा (मत पूछो मेरी क्यों), किसी भी अगले फोन यह वास्तव में रेक्ट मैं setNeedsDisplayInRect में पैरामीटर के रूप में निर्दिष्ट है। क्या आपने स्पर्श को एक से अधिक बार परीक्षण किया था? –
यह ज्यादातर डिवाइस पर सीधे होता है। लेकिन अगर आप अपनी अंगुली को चारों ओर ले जाते हैं और फिर लगभग 10 या 15 सेकंड तक प्रतीक्षा करते हैं, तो आप सिम्युलेटर पर ऐसा कर सकते हैं, फिर स्पर्श करें और फिर से जाएं। आईपैड 3 डिवाइस पर, यह तब भी होता है जब उंगली चलती है। बहुत परेशान :) – mprivat
मैंने इसे थोड़ी देर पहले पोस्ट किया था (http://stackoverflow.com/questions/9299018/setneedsdisplayinrect-bug-in-ios5)। ऐसा लगता है कि केवल पहली कॉल पर ही था। मुझे कोई कारण/फिक्स नहीं मिला और बस चले गए क्योंकि मुझे प्रदर्शन अनुकूलन के उस स्तर की आवश्यकता नहीं थी।क्या आप rect == व्यू आकार के लिए परीक्षण कर सकते हैं और ड्रॉ नहीं कर सकते? शायद एक विकल्प नहीं है। –