Выйти замуж за Core Animation с помощью OpenGL ES

Изменить: я полагаю, что вместо объяснения, приведенного ниже, я также могу спросить: Отправка -setNeedsDisplay в экземпляр CAEAGLLayer не вызывает перерисовку слоя (т. -drawInContext: не вызывается). Вместо этого я получаю это сообщение консоли:

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

Есть ли способ обойти эту проблему? Могу ли я вызвать -drawInContext: когда -setNeedsDisplay ? Длинное объяснение ниже:


У меня есть сцена 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 создавал accessors, переопределял +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, вы можете просмотреть этот метод в сеансе 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 (что возможно, но не как изящная ИМО).

2 Solutions collect form web for “Выйти замуж за Core Animation с помощью OpenGL ES”

Вы пробовали сделать родительский слой выше слоя OpenGL и анимировать это вместо этого?

Вы можете переопределить display вместо drawInContext . Во время анимации анимированное значение находится на уровне презентации.

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

В конце уровень представления будет иметь значение уровня модели, поэтому перед запуском анимации вам нужно будет установить окончательное значение на уровне модели.

  • Почему CIContext.createCGImage вызывает утечку памяти?
  • CABasicAnimation не меняет свое свойство позиции после завершения анимации
  • Многосэмплированный рендеринг текстуры в ios
  • Почему glGenerateMipmap () на устройстве iOS занимает столько памяти клиента?
  • Рисование с помощью GLKit
  • glkView drawInRect не вызван
  • Связывание второго буфера вершин, похоже, портит мой первый буфер вершин, OpenGL OES ios 5.1
  • Артефакты при включении 4x MSAA сглаживания на iPad / iOS
  • Проблема чтения данных glreadpixel () при использовании буфера глубины и метода сглаживания
  • EAGLContextView renderbufferstorage: fromDrawable: часто не работает на ios8
  • GLSL Shader Error "Конструкторские вызовы могут не иметь точности"
  • Interesting Posts

    Установите ширину в iOS 8 Today Extensions

    Отладка неперехваченного исключения в Xcode

    Swift – порядок сохраненных значений полностью изменяется в словаре

    iOS – использование UISearchDisplayController в UITableViewController со статическими ячейками

    Предупреждение Cocoapods – CocoaPods не установили базовую конфигурацию вашего проекта, потому что, поскольку в вашем проекте уже есть собственный набор настроек

    Блокировка ориентации iPad при нажатии кнопки

    Доступ к встроенному звуку будильника iOS в моем приложении

    Xamarin.IOS: сбой UITableViewSource на устройстве

    Xcode AutoLayout, Сделать маржу пропорциональной по высоте

    UIImagePickerController черная непрозрачная нижняя панель

    Профилирование приложения OpenGL ES на iOS

    Основные данные EXC_BAD_ACCESS для ненулевых целых значений

    Есть ли какие-либо другие звуковые системы iOS, кроме «tock»?

    UISplitViewController: как представить главный вид в подробном представлении по событию кнопки, а не через жестовый саблей

    RxSwift – Debounce / Throttle "inverse"

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.