संपादित साथ कोर एनिमेशन शादी: मैं लंबे समय से स्पष्टीकरण नीचे मैं भी पूछ सकते हैं के बजाय लगता है: 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
विधि का उपयोग नहीं करती हैं। क्या कोई इसकी पुष्टि कर सकता है? क्या इसके आसपास कोई रास्ता है?
या क्या मैं ऊपर दी गई तकनीक का उपयोग नहीं कर सकता? इसका मतलब यह होगा कि मुझे ओपनजीएल रेंडरर में मैन्युअल रूप से एनिमेशन लागू करना होगा (जो संभव है लेकिन सुरुचिपूर्ण आईएमओ के रूप में नहीं)।
सुझाव के लिए धन्यवाद। मैं इसे आज़माउंगा और रिपोर्ट करूंगा। –
यह वास्तव में इस तरह से काम करता है, बहुत बहुत धन्यवाद! प्रदर्शन एक शुद्ध ओपनजीएल समाधान के रूप में उतना अच्छा प्रतीत नहीं होता है, लेकिन मैं जल्द ही विनिर्देशों के बारे में एक ब्लॉग पोस्ट लिखने वाला हूं। –