我正好遇到了这个问题。目前尚不清楚原因是否相同,但在我的情况下,我是从 displayLink 触发器触发渲染 - 不考虑 setNeedsDisplay 的语义,也不考虑 GLKit 如何在执行 drawInRect 方法时设置渲染缓冲区。
我的心态是,因为我使用了 displayLink,所以我可以直接从那个触发器运行我的所有渲染——而且因为在我尝试设置抗锯齿之前这一切都起作用了,我认为这不会是大错特错!
该问题仅在我设置 GLKViewDrawableMultisample4X 时才出现,就像 OP 的问题一样。
解决方案...
- 确保使用 enableSetNeedsDisplay = NO 创建视图
- 让 displayLink 触发一个函数,该函数仅包含以下内容:
- (void)render:(CADisplayLink*)displayLink {
// 这个函数应该*不*执行任何渲染
// 我们只想通知 GLKit 我们已经准备好渲染
GLKView * view = [self.window.subviews objectAtIndex:0];
// 告诉 GLKit 我们已经准备好绘制了
[查看显示];
// GLKit 将确保在之前设置缓冲区
// 调用 drawInRect
}
- 将所有渲染移到 drawInRect 中。GLKit 将确保在调用 drawInRect 之前设置缓冲区。