2010-12-21 16 views
11

संपादित साथ कोर एनिमेशन शादी: मैं लंबे समय से स्पष्टीकरण नीचे मैं भी पूछ सकते हैं के बजाय लगता है: CAEAGLLayer का एक उदाहरण के लिए भेजा जा रहा है -setNeedsDisplay परत पुनः बनाने का कारण नहीं है (अर्थात, -drawInContext: कहा जाता है नहीं है)।OpenGL ES

<GLLayer: 0x4d500b0>: calling -display has no effect. 

वहाँ इस समस्या के समाधान के लिए एक रास्ता है: इसके बजाय, मैं इस सांत्वना संदेश मिलता है? क्या मैं -drawInContext: का आह्वान कर सकता हूं जब -setNeedsDisplay कहा जाता है? नीचे लंबी व्याख्या:


मेरे पास एक ओपनजीएल दृश्य है जिसे मैं कोर एनीमेशन एनिमेशन का उपयोग करके एनिमेट करना चाहता हूं।

कैलियर में कस्टम गुणों को एनिमेट करने के मानक दृष्टिकोण के बाद, मैंने CAEAGLLayer का उप-वर्ग बनाया और उसमें sceneCenterPoint संपत्ति को परिभाषित किया जिसका मूल्य एनिमेटेड होना चाहिए। रेंडरर को sceneCenterPoint संपत्ति के वर्तमान मूल्य गुजरती हैं और पूछने के लिए

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 
#import "ES2Renderer.h" 

@interface GLLayer : CAEAGLLayer 
{ 
    ES2Renderer *renderer; 
} 

@property (nonatomic, retain) ES2Renderer *renderer; 
@property (nonatomic, assign) CGPoint sceneCenterPoint; 

मैं तो संपत्ति घोषित @dynamic सीए accessors बना सकते हैं, +needsDisplayForKey: ओवरराइड और -drawInContext: लागू करने के लिए: मेरी परत भी ओपन रेंडरर के लिए एक संदर्भ रखती है यह दृश्य प्रस्तुत करने के लिए:

#import "GLLayer.h" 

@implementation GLLayer 

@synthesize renderer; 
@dynamic sceneCenterPoint; 

+ (BOOL) needsDisplayForKey:(NSString *)key 
{ 
    if ([key isEqualToString:@"sceneCenterPoint"]) { 
     return YES; 
    } else { 
     return [super needsDisplayForKey:key]; 
    } 
} 

- (void) drawInContext:(CGContextRef)ctx 
{ 
    self.renderer.centerPoint = self.sceneCenterPoint; 
    [self.renderer render]; 
} 
... 

(आप WWDC 2009 सत्र वीडियो तक पहुंच प्राप्त हैं, तो आप सत्र 303 ("एनिमेटेड ड्राइंग") में इस तकनीक की समीक्षा कर सकते हैं)।

अब, जब मैं मुख्यपथ @"sceneCenterPoint" पर परत के लिए एक स्पष्ट एनीमेशन बनाने के लिए, कोर एनिमेशन कस्टम गुण के लिए अंतर्वेशित मूल्यों की गणना और -drawInContext: एनीमेशन के प्रत्येक चरण के लिए बुलाना चाहिए:

- (IBAction)animateButtonTapped:(id)sender 
{ 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sceneCenterPoint"]; 
    animation.duration = 1.0; 
    animation.fromValue = [NSValue valueWithCGPoint:CGPointZero]; 
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(1.0f, 1.0f)]; 
    [self.glView.layer addAnimation:animation forKey:nil]; 
} 

कम से कम यह सामान्य CALayer सबक्लास के लिए होगा।

2010-12-21 13:59:22.180 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 
2010-12-21 13:59:22.198 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 
2010-12-21 13:59:22.216 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 
2010-12-21 13:59:22.233 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 
... 

तो यह है कि, संभवतः प्रदर्शन कारणों से, ओपन परतों के लिए, -drawInContext: क्योंकि कहा जाता है नहीं हो रही है लगता है: जब मैं CAEAGLLayer उपवर्ग, मैं एनीमेशन के प्रत्येक चरण के लिए कंसोल पर इस आउटपुट प्राप्त ये परतें खुद को आकर्षित करने के लिए मानक -display विधि का उपयोग नहीं करती हैं। क्या कोई इसकी पुष्टि कर सकता है? क्या इसके आसपास कोई रास्ता है?

या क्या मैं ऊपर दी गई तकनीक का उपयोग नहीं कर सकता? इसका मतलब यह होगा कि मुझे ओपनजीएल रेंडरर में मैन्युअल रूप से एनिमेशन लागू करना होगा (जो संभव है लेकिन सुरुचिपूर्ण आईएमओ के रूप में नहीं)।

उत्तर

4

क्या आपने ओपनजीएल परत के ऊपर एक पैरेंट परत बनाने और इसके बजाए एनिमेट करने का प्रयास किया है?

+0

सुझाव के लिए धन्यवाद। मैं इसे आज़माउंगा और रिपोर्ट करूंगा। –

+0

यह वास्तव में इस तरह से काम करता है, बहुत बहुत धन्यवाद! प्रदर्शन एक शुद्ध ओपनजीएल समाधान के रूप में उतना अच्छा प्रतीत नहीं होता है, लेकिन मैं जल्द ही विनिर्देशों के बारे में एक ब्लॉग पोस्ट लिखने वाला हूं। –

6

आप drawInContext के बजाय display ओवरराइड कर सकते हैं। एनीमेशन के दौरान, एनिमेटेड मान प्रस्तुति परत में है।

- (void) display 
{ 
    GLLayer* myPresentationLayer = (GLLayer*)[self presentationLayer]; 
    self.renderer.centerPoint = myPresentationLayer.sceneCenterPoint; 
    [self.renderer render]; 
} 

अंत में प्रस्तुति परत में मॉडल परत मान होगा, इसलिए आपको एनीमेशन शुरू करने से पहले मॉडल परत पर अंतिम मान सेट करने की आवश्यकता होगी।

+0

ग्रेट सुझाव, जेफ, धन्यवाद। मैंने कोशिश की और यह दृष्टिकोण भी काम करता है। प्रदर्शन के अनुसार, ऐसा लगता है कि पिताजी के विचार के समान गेंदबाजी में ऐसा लगता है। –

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