为什么在ViewDidLoad中没有设置GLKView的DrawableWidth?

时间:2012-03-04 18:33:56

标签: opengl-es ios5 glkit

我正在使用GLKit的GLKViewController / GLKView来做一些基本的OpenGL绘图。

我想在ViewDidLoad方法中设置ViewPort。在阅读了GLKView参考文献之后,我想我能够这样做:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }
    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    glViewport( 0, 0, view.DrawableWidth, view.DrawableHeight );
}

问题是DrawableWidthDrawableHeight属性都为零。这是为什么?当GLKView调用DrawInRect时,它们被设置并且它们的值就是我所期望的。

2 个答案:

答案 0 :(得分:3)

GLKView Class Reference说:

  

此后,只要必须重绘视图,视图就会自动创建或更新帧缓冲对象。

在您收到viewDidLoad时尚未创建帧缓冲区,因为尚未绘制视图。因此帧缓冲的尺寸也不存在。

此时系统创建帧缓冲区是不合适的。该视图尚未添加到屏幕视图层次结构中。在将其添加到屏幕视图层次结构后,可能会调整其大小,这需要丢弃旧的帧缓冲区并创建一个新的帧缓冲区。

视图会一直等到它实际被要求绘制自己以创建帧缓冲区,因此它不会浪费时间创建一个帧缓冲区,只是为了稍后扔掉它。

答案 1 :(得分:1)

您必须先拨打[view bindDrawable];

然后drawableWidthheight将是正确的。这是因为在设置帧缓冲区未绑定后,drawableWidth / height反映了帧缓冲区属性。