Изменение размера GLKView

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

В моем сценарии у меня есть GLKView с включенным setNeedsDisplay, поэтому в любое время, когда мне нужно обновить его содержимое на экране, я просто вызываю -setNeedsDisplay на этом GLKView. Я использую GLKView для рисования изображений, поэтому, если мне нужно нарисовать изображение другого размера, мне также нужно изменить размер GLKView.

Проблема: когда я изменяю размер GLKView и вызываю setNeedsDisplay в этом представлении, результат на экране неверен. Это связано с тем, что GLKView не завершает закулисные операции, вызванные новым изменением размера, прежде чем он попытается отрисовать новое изображение.

Я нашел обходной путь, позвонив: performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0 вместо просто setNeedsDisplay на GLKView. Это в основном заставляет основной поток ждать завершения всех закулисных операций openGL перед вызовом setNeedsDisplay. Хотя это работает нормально, мне интересно, есть ли лучшее решение. Например, есть ли вызов openGL, чтобы заставить поток ждать завершения всех операций openGL, прежде чем продолжить?


person spybart    schedule 20.10.2011    source источник


Ответы (1)


Решение состояло в том, чтобы сбросить объект CIContext после изменения размера GLKView.

person spybart    schedule 07.04.2012
comment
Как ты его сбросил? Воссоздать его с нуля? Или есть определенный метод для вызова. - person flainez; 22.01.2017
comment
В моем случае после изменения размера я устанавливал свой объект CIContext так: ci_context = [CIContext contextWithEAGLContext:glkView.context], а затем вызывал [glkView display]. Обратите внимание, что это было давно, и я не пытался узнать об этом, поэтому не думайте, что это правильный подход. - person spybart; 23.01.2017