Замена асинхронного GLKit GLKViewController (асинхронное рисование OpenGL)
Согласно этому вопросу и его ответу GLKViewController
не совсем совместим с асинхронным режимом рисования OpenGL.
Кто-нибудь знает о каких-либо переопределениях с открытым исходным кодом или примером кода? GLKViewController
(UIViewController
подкласс), но с большим количеством ручных элементов управления, чтобы его можно было использовать вместе с асинхронным рисованием?
1 ответ
Этот вопрос просто слишком широк. Вы ищете образец с более ручным управлением? Вы должны быть более точными в том, что вы ищете.
Я не знаю много хороших источников или примеров, которые реализуют что-то относительно высокого уровня, как контроллер представления, но я знаю несколько очень хороших процедур о том, как разделить ваши модули, чтобы иметь отличную поддержку асинхронного использования openGLES на iOS.
Для подробного описания того, как портировать GLKViewController
Вы должны перечислить элементы, которые вы уже используете, или, скорее, элементы, на которые у вас возникают проблемы при получении ответа в Интернете. К сожалению, мое мнение об использовании обоих GLKViewController
а также GLKView
это просто "Не надо!"
Что касается разделения модулей для многопоточности, то я использую класс, который оборачивает контекст и инициализируется потоком и, возможно, другой оберткой контекста для поддержки совместного использования между контекстами. Как работает эта оболочка, так это то, что каждый метод, вызываемый в оболочке, передается для выполнения в потоке, к которому привязана оболочка. Кроме того, он также содержит методы performBlock:
а также performBlock:callback:
который выполнит блок в связанном потоке и при необходимости вызовет другой блок после его завершения.
С этого момента эта оболочка разделена на подклассы и содержит текущие состояния контекста (для оптимизации), включает пул загруженных шейдеров (кеш) и пул загруженных текстур (кеш). Общие обертки также связаны с их родителем, с которым они были созданы, поэтому только родители содержат пулы.
Таким образом, процедура загрузки текстуры в фоновом режиме будет выглядеть примерно так:
- Начиная только с
mainContext
- Создать
newThread
- Создать
sharedContext
отmainContext
иnewThread
- Запросить
mainContext
создатьtexture
(просто чтобы получить удостоверение личности) - По завершении запроса
sharedContext
загрузить данные текстуры вtexture
и уведомитьmainContext
когда сделано. - Делай что хочешь с
texture
и удалитеsharedContext
или, скорее, сохранить его для дальнейшего использования.
Теперь я надеюсь, что с помощью этой процедуры вы сможете легко создать систему более высокого уровня, в которой для наиболее распространенного случая вы создадите класс, содержащий две обертки контекста, основной контекст и фоновый рабочий. Такой тип системы должен быть чрезвычайно прост в обслуживании, и с точки зрения использования вам никогда не придется беспокоиться о многопоточности.
После этого, чтобы получить довольно близко к GLKViewController
У меня есть класс, содержащий буфер кадров и буферов рендеринга, который инициализируется либо с UIView
для отображения или инициализации с размером, который генерирует текстуру и используется для системы FBO. Таким образом, наличие контроллера представления, который включает этот класс и обертку контекста, может быть довольно мощным инструментом, который может показаться вам необходимым.
Если вы решите внедрить такую систему и столкнетесь с какими-либо проблемами, я был бы рад услышать об этом и помочь вам, а точнее, узнать о вашем успехе.