Я только что преобразовал свой код из диспетчера EAGLContext, в котором я себя прокрутил, используя классы GLKit.
Вы предлагаете "... игнорировать методы .. glkView:drawInRect:
и просто рисовать чтовам нужно, когда мне это нужно ".Это похоже на разумный вариант с точки зрения производительности;Я предполагаю (хотя и не пытался), если вы просто не зададите GLKViewDelegate
или предоставите подкласс GLKView
с его определенным drawInRect:
, тогда рендеринг цикла анимации не произойдет.Вы пытались это сделать?
В качестве альтернативы можно было бы просто создать @property (assign, nonatomic) BOOL shouldUpdate;
в вашем MyController : GLKViewController <GLKViewDelegate>
классе, который будет обновляться, только если есть что сделать:
[self setDelegate:self]; // in init or awakeFromNib or other..
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
if ([self shouldUpdate]) { ...
I 'Я уверен, что вы поняли идею, это вряд ли сложно.
Стоит отметить одну вещь: в официальных документах API указано, что viewDidLoad
должен использоваться в вашем GLKViewController
для начальной настройки GL.У меня были проблемы с этим;почему-то мои glCreateShader
звонки всегда возвращали ноль.Это может быть связано с тем, что я установил EAGLContext
после инициализации;Я не мог передать его как параметр init
, так как я создал контроллер в раскадровке.Однако в коде не было ничего логически неправильного, поэтому я предлагаю это дружеское предупреждение на случай возникновения подобных проблем.Мое решение состоит в том, чтобы просто иметь следующее в моем drawInRect:
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
if ([self initialGLSetupDone] == NO) {
[self beforeFirstRender];
[self setInitialGLSetupDone:YES];
}
// .. rest of render code goes here.
}
Очевидно, что не обязательно иметь IF там без необходимости, но это было простое решение.
Дайте мне знать, какЭто происходит, если вы пытаетесь обновить, чтобы использовать GLKit.