我刚刚将我的代码从使用 EAGLContext 管理器转换为使用 GLKit 类。
您建议您可以“..忽略..glkView:drawInRect:
方法,并在我需要的时候画出[您]需要的东西”。从性能上看,这似乎是一个明智的选择;我假设(虽然没有尝试过)如果你只是不指定 aGLKViewDelegate
或提供一个定义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]) { ...
我相信你明白了,这并不复杂。
值得一提的是:官方 API 文档声明viewDidLoad
应该在您GLKViewController
的初始 GL 设置中使用。我对此有疑问;出于某种原因,我的glCreateShader
电话总是返回零。这可能是由于我设置了EAGLContext
初始化后;我无法将它作为init
参数传递,因为我在 Storyboard 中创建了控制器。但是,代码在逻辑上没有任何问题,因此我提供此友好警告,以防您遇到类似问题。我的解决方案只是在我的 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,请告诉我情况如何。