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

3

我正在使用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个回答

3

GLKView类参考中说:

此后,每当视图必须重新绘制时,视图会自动创建或更新帧缓存对象。

在收到viewDidLoad时,帧缓存还没有被创建,因为视图尚未需要被绘制。因此,帧缓存的尺寸也不存在。

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

视图等待实际要求它绘制自己才创建帧缓存,以便不浪费时间创建然后再丢弃帧缓存。


谢谢澄清,我想我应该只使用 view.frame.size 来设置它。 - Gabriel G. Roy
viewDidLoad 不是使用 view.frame.size 的好时机。https://dev59.com/8mkw5IYBdhLWcg3w9vF-#9540935 - rob mayoff
那么,@rob,什么时候是个好时机?编辑:哦,可能最好使用 UIScreen.mainScreen().bounds.widthheight - Grumdrig
1
viewDidLayoutSubviews - rob mayoff
记录一下,它们似乎也没有被设置,所以我在那里也使用了 UIScreen.mainScreen().bounds。 (抱歉,在一个 ObjC 问题中使用了 Swift。) - Grumdrig

1

你必须先调用[view bindDrawable];

然后drawableWidthheight才会正确。这是因为设置帧缓冲后,帧缓冲被解绑,drawableWidth/height反映了帧缓冲的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接