2011-10-09 10 views
6

पर पृष्ठभूमि धागे में चित्रण मेरे पास कुछ जटिल ड्राइंग तर्क के साथ एक दृश्य है (यह एक नक्शा दृश्य है जो जीआईएस डेटा से खींचता है)। मुख्य थ्रेड पर इस ड्राइंग को यूआई को लॉक करता है और ऐप को उत्तरदायी बनाता है। मैं ड्राइंग को पृष्ठभूमि थ्रेड में ले जाना चाहता हूं उदाहरण के लिए एनएसओपरेशन।आईओएस

इसकी संरचना करने का सबसे अच्छा तरीका क्या है?

मैं वर्तमान में एक बंद स्मृति CGContext को चित्रित कर रहा हूं और उसके बाद इसे एक CGImageRef में परिवर्तित करता हूं जिसे मैं मुख्य धागे पर देखने के लिए दृश्य में भेजता हूं। दुर्भाग्यवश यह बहुत सारी मेमोरी का उपयोग करता है और ऐसा लगता है कि जीपीयू त्वरण अब उपयोग नहीं किया जाता है क्योंकि यह काफी धीमा है। पृष्ठभूमि धागे से सीधे देखने के लिए कोई तरीका है? मुझे पता है कि UIKit मल्टी-थ्रेड सुरक्षित नहीं है लेकिन शायद मैं ड्राइंग कर रहा हूं, जबकि दृश्य को लॉक करने का कोई तरीका है?

उत्तर

1

मैं आईफोन पर ऐसी स्थिति में कभी नहीं आया हूं लेकिन मैक पर मुझे एक ही समस्या थी।

  1. ऑफलाइन संदर्भों की ड्राइंग गतिविधि को प्रतिनिधि करने के लिए CGLayer का उपयोग करें।
  2. वर्तमान NSRunLoop के लिए टाइमर जोड़ने का प्रयास करें और समय अंतराल पर अपने ग्राफ़िक आदेश निष्पादित करें। यह कुछ इस तरह देखना चाहिए ...

...

kRenderFPS 25.0 //This is Maximum value 

renderTimer = [[NSTimer timerWithTimeInterval:(1.0/(NSTimeInterval)kRenderFPS) target:viewobject selector:@selector(RenderUI:) userInfo:nil repeats:YES] retain]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSDefaultRunLoopMode]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSModalPanelRunLoopMode]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSEventTrackingRunLoopMode]; 

//In view class 
-(void)RenderUI:(id)param 
{ 
    [self setNeedsDisplayInRect:[self bounds]]; 
} 

इस चाल करना चाहिए।

अपनी प्रक्रिया का नमूना देने और जांचने का प्रयास करें कि कौन सी CPU का उपभोग कर रहा है। यह यूआई उत्तरदायी और बहुत तेज बना देगा।

आपके द्वारा उल्लिखित प्रदर्शन समस्या कुछ और के कारण हो सकती है। नमूना प्रक्रिया सीपीयू करने की कोशिश करें। यह आपको अंतर्दृष्टि देगा कि वास्तव में कौन सी सीपीयू ले रहा है।

+0

क्या आपका मतलब कैलियर है? –

+1

सं। CGLayer। http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGLayer/Reference/reference.html – MacGeek

+0

तो मैं अब इस दृष्टिकोण को आजमा रहा हूं लेकिन यहां तक ​​कि यदि मैं एनएसटीमर के साथ चलता हूं और केवल 50% उस समय (ड्राइंग चक्र के अधिकतम 0.1s के लिए 0.2s अंतराल पर चलाएं) ऐसा लगता है कि यह अभी भी सभी यूआई घटनाओं को अनदेखा कर रहा है। इसके लिए क्या कोई तरकीब है? –

6

आईओएस 4.0, drawing is thread safe से परे। आपको CGContext स्वयं को बनाने की आवश्यकता हो सकती है, लेकिन पृष्ठभूमि थ्रेड पर कोई कारण नहीं है।

उस ने कहा, अधिकांश UIKit संचालन नहीं हैं। यदि आपको उनको करने की ज़रूरत है, तो आप हमेशा पृष्ठभूमि थ्रेड में तैयार कर सकते हैं, और फिर आवश्यक होने पर performOnMainThread का उपयोग कर सकते हैं। यहां तक ​​कि waitUntilDone भी है। उस ने कहा, आपको स्पष्ट रूप से NSOperation और NSOperationQueue का उपयोग करना चाहिए।

+1

इस बारे में बहुत भ्रम प्रतीत होता है लेकिन यह सही जवाब है, आईओएस 4.0 के साथ आईओएस 4.0 ड्राइंग के रूप में थ्रेड सुरक्षित है। यहां इसकी आधिकारिक घोषणा है: http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS4.html ("थ्रेड" के लिए खोजें)। –

+0

@ जोन तिरसेन, उत्तर को साबित करने में मदद के लिए धन्यवाद। –