2015-04-13 2 views
0

В соответствии с этим question and its answerGLKViewController не совместим с режимом рисования асинхронного OpenGL.Замена GLKViewController Async GLKit (асинхронный рисунок OpenGL)

Кто-нибудь знает о каком-либо открытом исходном коде или образце кода, переопределяющем GLKViewController (UIViewController), но с более ручным управлением, чтобы его можно было использовать вместе с асинхронным рисунком?

ответ

1

Этот вопрос слишком широк. Вы ищете образец с более ручным управлением? Вы должны быть более конкретными в том, что вы ищете.

Я не знаю много хороших источников или образцов, которые реализуют что-то относительно высокого уровня, как контроллер вида, но я знаю несколько очень хороших процедур о том, как отделить ваши модули, чтобы иметь отличную поддержку для асинхронного использования openGLES на iOS.

Для получения подробного описания о том, как переносить GLKViewController, вы должны перечислить элементы, которые вы уже используете, или, скорее, предметы, с которыми вы столкнулись с проблемой получения ответа в Интернете. К сожалению, мое мнение об использовании как GLKViewController, так и GLKView - это просто «Не надо!».

Так что о том, что разделение модулей для многопоточности, я использую класс, который обертывает контекст и инициализируется потоком и, необязательно, с другой оболочкой контекста для поддержки совместного использования контекстов. Как работает эта оболочка, каждый метод, который вызывается в оболочке, передается для выполнения в потоке, к которому привязан обертка. В дополнение к этому он также содержит методы performBlock: и performBlock:callback:, которые будут выполнять блок по связанным потокам и, при необходимости, вызывать другой блок после его завершения.

Далее на этой оболочке далее подклассы, содержащие текущие контекстные состояния (для оптимизации), включают загруженный пул шейдеров (cache) и загруженный пул текстур (кеш). Общие обертки также связаны с их родителем, с которым они были созданы, поэтому только родители содержат пулы.

Так процедура загрузки текстуры в фоновом режиме будет выглядеть примерно так:

  • Начиная только с mainContext
  • Создать newThread
  • Создать sharedContext из mainContext и newThread
  • Запросите mainContext, чтобы создать texture (только для получения ID)
  • По завершении запроса sharedContext загрузите данные текстуры в texture и сообщите mainContext, когда закончите.
  • Сделайте то, что вы хотите, с помощью texture и удалите sharedContext или скорее сохраните его для последующего использования.

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

После этого, чтобы получить довольно близко к GLKViewController У меня есть класс, содержащий буфер кадра и делают буфера, которые инициализируются либо с UIView для отображения или инициализированы с размером, который генерирует текстуру и используется для системы FBO. Таким образом, наличие контроллера представления, который включает этот класс и оболочку контекста, может быть довольно мощным инструментом, который вроде бы кажется вам, что вам может понадобиться.

Если вы решите внедрить такую ​​систему и столкнуться с любыми проблемами, я был бы рад услышать об этом и помочь вам, а точнее, еще услышать о вашем успехе.