gpt4 book ai didi

iphone - 将核心动画与 OpenGL ES 结合

转载 作者:技术小花猫 更新时间:2023-10-29 10:50:12 25 4
gpt4 key购买 nike

编辑: 我想除了下面的长篇解释之外,我可能还会问:将 -setNeedsDisplay 发送到 CAEAGLLayer 的实例不会导致要重绘的图层(即 -drawInContext: 未被调用)。相反,我收到此控制台消息:

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

有没有办法解决这个问题?我可以在调用 -setNeedsDisplay 时调用 -drawInContext: 吗?详细解释如下:


我有一个 OpenGL 场景,我想使用 Core Animation 动画制作动画。

按照在 CALayer 中为自定义属性设置动画的标准方法,我创建了 CAEAGLLayer 的子类,并在其中定义了一个属性 sceneCenterPoint,其值应该是动画的。我的图层还包含对 OpenGL 渲染器的引用:

#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 让 CA 创建访问器,覆盖 +needsDisplayForKey: 并实现 -drawInContext: 以传递sceneCenterPoint 属性的当前值到渲染器并要求它渲染场景:

#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 session 视频,则可以在 session 303(“动画绘图”)中查看此技术)。

现在,当我在 keyPath @"sceneCenterPoint" 上为层创建显式动画时,Core Animation 应该计算自定义属性的插值并调用 -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 子类来说是这样。当我对 CAEAGLLayer 进行子类化时,我在动画的每个步骤的控制台上都得到了这个输出:

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.
...

所以看起来,可能出于性能原因,对于 OpenGL 层,-drawInContext: 没有被调用,因为这些层不使用标准的 -display 方法来画自己。有人可以证实吗?有解决办法吗?

或者我不能使用上面列出的技术吗?这意味着我将不得不在 OpenGL 渲染器中手动实现动画(这是可能的,但在 IMO 中并不优雅)。

最佳答案

您可以覆盖 display 而不是 drawInContext。在动画过程中,动画值在表现层。

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

最后表示层将具有模型层值,因此您需要在开始动画之前在模型层上设置最终值。

关于iphone - 将核心动画与 OpenGL ES 结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com