OpenGL ES 2.0 iPhone - Рендеринг в фоновом потоке блоков основного потока - PullRequest
3 голосов
/ 27 февраля 2012

Я рендеринг контекста OpenGL в фоновом потоке с другим EAGLContext, чем основной поток.

Я использую что-то вроде этого:

- (void)renderInBackground {
      EAGLContext *context = [[EAGLContext] alloc] init];
      [EAGLContext setCurrentContext:context];


       Rendering..
    }

Однако, даже если это выполняется в фоновом потоке, при использовании тяжелого шейдера основной поток блокируется и пользовательский интерфейс застревает.

Почему фоновый поток блокирует основной поток?методы не синхронизированы.

1 Ответ

8 голосов
/ 01 марта 2012

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

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

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

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

...