2013-09-08 2 views
1

Недавно я улучшаю свои навыки OpenGL ES, изучая исходный код GPUImage. Пока я читал код для класса GPUImageContext, я получаю, что он хранит ссылку на queue, что он используется в других частях библиотеки.GPUImage: EAGLContext и очередь потоков

Например, в GPUImageView.m очередь используется в commonInit с runSynchronouslyOnVideoProcessingQueue для выполнения некоторых операций, не связанных непосредственно с контекстом (например, добавление атрибутов в шейдер).

Мой вопрос в том, почему разработчик решил выполнить эти операции в «вторичной» очереди, и это полезно для хранения этой очереди в классе, таком как GPUImageContext.

Я знаю, что этот вопрос строго связан с инфраструктурой GPUImage, но я думаю, что это может быть большой возможностью понять, как опытный разработчик, так как Брэд Ларсон решил структурировать одну из самых известных библиотек для Image Manipulation в iOS ,

P.s. Надеюсь, я не обидел автора своим любопытством.

ответ

5

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

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

Вы можете выбрать все это только в основной теме, что я и сделал сначала, но это имело некоторые недостатки. Медленная обработка может блокировать пользовательский интерфейс. Выполнение рендеринга OpenGL ES в фоновом потоке имеет значительные преимущества в производительности: от 10% ускорения на одноядерных устройствах до более 40% ускорения на многоядерном iOS-оборудовании. Вы также защищены от случаев, когда разработчик, использующий фреймворк, обращается к нему из не основного потока.

+0

Отлично! Это действительно исчерпывающий ответ. – MatterGoal

Смежные вопросы