2012-04-09 25 views
8

मेरे पास कुछ ओपनजीएल ड्राइंग को संभालने के लिए एक GLKViewController है। मेरे पास glkView:drawInRect और update दोनों लागू हैं और preferredFramesPerSecond संपत्ति 30 (डिफ़ॉल्ट) पर सेट है।GLKViewController अवरुद्ध हो रहा है

समस्या यह है कि जब उपयोगकर्ता ऐप के दूसरे भाग के साथ इंटरैक्ट करता है तो प्रतिनिधि विधियां फायरिंग बंद कर देती हैं। मैंने जो दो मामलों को देखा है, वह तब होता है जब उपयोगकर्ता UITableView को स्क्रॉल करता है या MKMapView के साथ इंटरैक्ट करता है।

क्या यह सुनिश्चित करने का कोई तरीका है कि ये प्रतिनिधि हमेशा आग लगाएंगे, भले ही बाकी ऐप क्या कर रहा हो। एकमात्र बार जब मैं इन्हें रोकना चाहता हूं वह तब होता है जब ऐप पृष्ठभूमि में प्रवेश करता है (जो स्वचालित रूप से होता है)।

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? – prince

+0

कोई वास्तविक कोड नहीं है। 'GLKViewController' init में मैंने 'पसंदीदा फ़्रेमपेरसेकंड' को 30 पर सेट किया है। –

उत्तर

15

इसका कारण यह है कि तालिका दृश्य में स्क्रॉलिंग के दौरान या मैप व्यू रनूप UITrackingRunLoopMode में है जो डिफ़ॉल्ट मोड की तुलना में उच्च प्राथमिकता है। यह उच्च स्क्रॉलिंग प्रदर्शन की गारंटी के लिए कुछ घटनाओं को फायरिंग से रोकता है।

अपनी समस्या का समाधान करने के लिए आपको GLKViewController पर भरोसा करने के बजाय अपना खुद का प्रतिपादन लूप सेट करना होगा।

  • पहले GLKViewNO के enableSetNeedsDisplay सेट (जब GLKViewController का उपयोग कर स्वचालित रूप से स्थापित किया जाना चाहिए)।
  • 0 (या शायद 1) को preferredFramesPerSecond सेट GLKViewController का प्रतिपादन पाश निष्क्रिय करने के लिए या सभी
  • आयात QuartzCore ढांचे पर GLKViewController का उपयोग नहीं करते: #import <QuartzCore/QuartzCore.h>
  • एक CADisplayLink बना सकते हैं और NSRunLoopCommonModes में शेड्यूल:
 
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
  • वैकल्पिक: (आधा फ़्रेमरेट =) से 2 DisplayLink की frameInterval सेट
  • प्रस्तुत करना विधि:
 
- (void)render:(CADisplayLink*)displayLink { 
    GLKView* view = (GLKView*)self.view; 
    [view display]; 
} 

मैं इस परीक्षण नहीं किया है, तो मुझे बताओ अगर यह काम करता है!

+3

यह काम करता है। मैं एक ऐसे तरीके की तलाश में था जहां मुझे ऐसा करने की ज़रूरत नहीं थी, लेकिन मुझे लगता है कि आप सही हैं कि यह जाने का एकमात्र तरीका है। –

+0

किसी कारण से, यह मेरे फ्रेम को प्रति फ्रेम 2 सेकंड तक जाने का कारण बनता है! –

+0

@ जोसेफहमफ्रे फ्रेम की जांच करें CADisplayLink की आंतरिक संपत्ति (डिफ़ॉल्ट = 1)। हो सकता है कि आपने इसे गलती से 30 पर सेट कर दिया हो? Framerate '1/(displayLink.frameInterval * displayLink.duration) के बराबर होना चाहिए' – Felix

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