Контекст OpenGL на iphone. Что это делает / как это работает? - PullRequest
1 голос
/ 05 марта 2012

Я уже довольно давно пытаюсь понять OpenGL ES 2.0 на iPhone, мне удалось заставить его работать как-то. Но есть кое-что, чего я не очень хорошо понимаю. Что такое контекст OpenGL? или для чего это?

Я знаю, что opengl не будет работать без его создания. Но я хотел бы, чтобы кто-то сказал мне, что именно.

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

Также я создаю только один и раздаю его?

Должен ли я уничтожить его, если я перестану использовать OpenGL?

Почему я могу сделать так, чтобы указатель контекста из объекта (например, glkview) указывал на мой созданный контекст EAGL? Это конкретный объект?

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

Спасибо

1 Ответ

1 голос
/ 05 марта 2012

Контекст OpenGL инкапсулирует все состояние экземпляра OpenGL.Таким образом, создание контекста - это способ инициализации OpenGL, а настройка контекста необходима для того, чтобы система могла понимать имена, которые вы позже цитируете для текстур, буферов кадров и т. Д. Поэтому очевидное использование нескольких контекстов - просто инкапсулироватьСостояние OpenGL, вместо того, чтобы позволить всему стать неявно глобальным.

OpenGL - это высоко модальный API и, следовательно, prima facie, небезопасный для многопоточности.Однако контексты ассоциируются только с одним потоком, и iOS допускает группы общего доступа, которые представляют собой наборы контекстов, которые могут использовать ресурсы с одинаковыми именами (при условии незначительной ручной синхронизации).До сих пор наиболее распространенное использование нескольких контекстов - это позволить фону подготовить дорогой ресурс (такой как загрузка большой текстуры), не прерывая работу пользователя в главном потоке.

Вы должны уничтожить контекстесли вы закончили с этим, чтобы ресурсы могли быть возвращены в систему.GLKView s берут контекст в init и выставляют свой текущий контекст для получения и установки через свойство context.

...