无法在应用程序中的两个视图控制器上运行两个OpenGL ES动画

时间:2011-04-15 16:15:23

标签: iphone objective-c xcode animation opengl-es

我希望得到一些帮助,因为我在尝试修复它几天之后真的陷入困境。

基本上,我的应用程序有一个名为levelsView的OpenGL ES动画,一旦打开就会显示。这是在视图控制器上启动动画的代码:

- (void)animate
{
levelsView.animationInterval = 1.0 / 60.0;
[levelsView startAnimating];
[levelsView release];
}

视图控制器还有一个“切换”按钮,可让用户更改动画。显示其他动画的代码如下:

    - (IBAction) Switch: (id) sender { 

    SnowFallViewController* vce = [[[SnowFallViewController alloc] initWithNibName:@"SnowFallViewController"
    bundle:nil] autorelease];
    [self presentModalViewController:vce animated:YES];
}

此处还有用于在第二个视图控制器上启动第二个动画的代码视图:

- (void)viewDidLoad {
[super viewDidLoad];

CGRect  rect = [[UIScreen mainScreen] bounds];

window = [[UIWindow alloc] initWithFrame:rect];

GLViewController *theController = [[GLViewController alloc] init];
self.controller = theController;
[theController release];

GLView *glView = [[GLView alloc] initWithFrame:rect];
[window addSubview:glView];

glView.controller = controller;

glView.animationInterval = 1.0 / kRenderingFrequency;
[glView startAnimation];
[glView release];

[window makeKeyAndVisible];

}

基本上,我遇到的问题是我无法让两个动画在同一个应用程序中工作,即当应用程序加载第一个动画时,但当用户点击“切换”按钮时,它们只会得到一个空白屏幕而不是第二个动画。

我注意到的一件事是,如果我没有启动第一个动画,第二个动画将起作用,即如果我进入动画代码并删除 [levelsView startAnimating]; 然后第二个动画将起作用(但显然第一个不会)。

任何有关如何解决这个问题的见解的人都可以让两个动画都能正常运作?

谢谢,

戴夫

1 个答案:

答案 0 :(得分:0)

假设您在GLView中使用CADisplayLink来运行动画循环,从经验来看,似乎他们在CADisplayLink中有机制,以确保它不会只是继续发出呼叫,如果你'无法跟上刷新率。如果你同时连接了多个CAD表演链接,那么逻辑会让自己稍微混淆一下。

我强烈建议您添加:

- (void)viewDidAppear:(BOOL)animated
{
    [glView startAnimation];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [glView stopAnimation];
}

这些与围绕呈现和解除视图控制器的内置机制相关联 - 视图控制器在第一个实例中被告知其视图确实出现时(即,转换完成)​​和第二个视图控制器的视图即将消失(即,在向外过渡开始之前)。根据控制器是否可见,在GL视图上停止和启动动画,您将节省大量处理并防止不同的OpenGL视图在渲染时间内相互争斗。