2014-12-15 1 views
0

Я задерживаю доступ к view.drawableHeight до viewDidAppear, но всегда так часто (примерно один раз в 3 раза) drawableHeight и drawableWidth равны 0. Рамка view.frame отображается правильно.Почему GLKView's drawableWidth и drawableHeight не установлены в viewDidAppear?

view.drawableHeight 
(NSInteger) $3 = 0 

view.drawableWidth 
(NSInteger) $4 = 0 

And this is the stack. 
[RootViewController viewDidAppear:] 
[UIViewController _setViewAppearState:isAnimating:] 
[UINavigationController: viewDidAppear:] 

(CGRect) [ view frame ] 
(CGRect) $2 = origin=(x=0, y=64) size=(width=768, height=960) 

self.view.layer.frame 
(CGRect) $14 = origin=(x=0, y=64) size=(width=768, height=960) 

(CGRect) [((UIWindow *)[self.view window ]) frame] 
(CGRect) $15 = origin=(x=0, y=0) size=(width=768, height=1024) 

Оконная рама выше, поскольку она включает в себя высоту навигационной панели.

Кажется, я мог бы использовать self.view.layer.frame, который должен дать мне размеры, которые обычно я ожидал бы drawableHeight и drawableWidth для переноса. Но мне было интересно, почему это поведение несовместимо, и если это может свидетельствовать о других проблемах. Мы находимся в viewDidAppear, поэтому можно ожидать, что фреймбуферы будут выделены, а drawableHeight и Width будут установлены так, чтобы отображать размер фреймбуфера.

Это происходит как на симуляторе xcode, так и на ipad mini.

ответ

1

Во-первых, не доверяйте симулятору для чего-либо связанного с GL/GPU. (Возможно, для базового прототипирования кода GL, но для получения подробной информации о том, что вы ожидаете отправить, всегда проверяйте устройство.)

Подходящая ширина и высота относятся к размеру фреймбуфера GL, управляемого видом. И хороший код рисования на iOS не выделяет ресурсы графического процессора, пока они, как известно, не понадобятся ... особенно в GL, поскольку многие из вещей, которые вы пытаетесь сделать с GL, на самом деле не произойдут до тех пор, пока вы не сделаете ничью. Предположительно, GLKView не создает свой фреймбуфер, пока ему не понадобится связать его, что не должно произойти, пока незадолго до того, как оно вызовет вашу реализацию drawRect:/glkView:drawInRect: в первый раз.

+0

Спасибо, что может это полностью объяснить! Хорошее объяснение. Я смог стабилизировать мой init, используя layer.frame.size в viewDidAppear, который не полагается на создаваемый фреймбуфер. Я должен задержать мой init до первого обновления. Я посмотрю, нужен ли мне фреймбуфер для моего оставшегося элемента init. – nishant