Невозможно запустить две анимации OpenGL ES на двух контроллерах представления в приложении - PullRequest
0 голосов
/ 15 апреля 2011

Я надеялся на некоторую помощь в этом, так как я действительно застрял после попытки исправить это в течение нескольких дней.

По сути, мое приложение имеет анимацию OpenGL ES, которая называется levelsView, которая отображается, как толькооно открылось.Вот код, который запускает мою анимацию на контроллере вида:

- (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 голосов
/ 15 апреля 2011

Предполагая, что вы используете CADisplayLink внутри GLView для запуска цикла анимации, из опыта видно, что у них есть механизмы внутри CADisplayLink, чтобы убедиться, что он не просто продолжает выполнять вызовы по вызовам, если вы этого не делаете идти в ногу с частотой обновления. Более чем возможно, что логика немного сбивает с толку, если к вам одновременно подключено несколько CADisplayLinks.

Я настоятельно рекомендую вам добавить:

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

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

Они связаны со встроенными механизмами, связанными с представлением и отклонением контроллера представления - контроллеру представления сообщают в первом случае, когда его представление действительно появилось (то есть, переход в закончен), и во втором, когда его представление собирается исчезнуть (то есть, незадолго до того, как начинается переход наружу). Остановив и запустив анимацию в GL-представлении в зависимости от того, виден ли ваш контроллер, вы сэкономите много времени на обработку и предотвратите столкновение разрозненных представлений OpenGL друг с другом за время рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...