Почему GLKView DrawableWidth не установлен в ViewDidLoad? - PullRequest
3 голосов
/ 04 марта 2012

Я использую GLKit GLKViewController / GLKView, чтобы сделать базовый рисунок OpenGL.

Я бы хотел настроить ViewPort в методе ViewDidLoad. Прочитав ссылку на 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 );
}

Проблема в том, что свойства DrawableWidth и DrawableHeight равны нулю. Это почему? Когда GLKView вызывает DrawInRect, они установлены, и их значения - это то, что я ожидал.

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Справочник по классам GLKView говорит об этом:

После этого представление автоматически создает или обновляет объект кадрового буфера всякий раз, когда представление должно быть перерисовано.

Framebuffer не был создан к тому времени, как вы получили viewDidLoad, потому что представление еще не нужно было рисовать. Таким образом, размеры кадрового буфера также не существуют.

Было бы неуместно, чтобы система к этому времени создавала кадровый буфер. Представление еще не было добавлено в иерархию представлений на экране. После того, как он добавлен в иерархию экранных представлений, его размер можно изменить, что потребует удаления старого кадрового буфера и создания нового.

Представление ожидает, пока его фактически попросят нарисовать себя для создания кадрового буфера, чтобы не тратить время на создание кадрового буфера, чтобы просто выбросить его позже.

1 голос
/ 27 сентября 2015

Сначала вы должны позвонить [view bindDrawable];

Затем drawableWidth и height будут правильными.Это связано с тем, что после установки буфер кадров не связан, а drawableWidth / height отражает свойства кадрового буфера.

...