Можно ли предположить, что блоки, запланированные для запуска в последовательной очереди, будут работать в одном потоке? - PullRequest
0 голосов
/ 27 марта 2011

Я создаю приложение для Mac OS 10.6, которое будет использовать OpenGL. Я бы хотел офшорный рендеринг во вторичную очередь отправки (вместо основного потока).

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

Однако очереди и потоки отправки не совпадают, и отладчик Xcode 4 показывает, что очередь может использовать несколько потоков. Поэтому я не уверен, что то, что я делаю, безопасно (хотя я считаю, что только параллельные очереди могут использовать несколько потоков).

Есть ли гарантия, что все блоки, отправленные в последовательную очередь, отправляются в один и тот же поток? Должен ли я вместо этого получить текущий контекст OpenGL и назначить его для моего NSOpenGLView в каждом кадре?

Ответы [ 4 ]

1 голос
/ 03 июля 2012

Более подробная информация об OpenGL с GCD приведена здесь:

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ConcurrencyandOpenGLES/ConcurrencyandOpenGLES.html

Объекты GCD и NSOperationQueue могут выполнять ваши задачи в потоке их выбор. Они могут создать поток специально для этой задачи, или они могут повторно использовать существующий поток. Но в любом случае вы не можете гарантировать, какой поток выполняет задачу. Для OpenGL ES приложение, что означает:

  • Каждая задача должна устанавливать контекст перед выполнением любого OpenGL ES команды.
  • Ваше приложение должно гарантировать, что две задачи, которые получают доступ к один и тот же контекст не может выполняться одновременно.
  • Каждое задание должно очистить контекст перед выходом.
1 голос
/ 28 марта 2011

Вам не нужен отдельный контекст OpenGL для каждого потока. Но контекст OpenGL должен быть активным только в одном потоке за раз. Так что вы могли бы сделать контекст активным при входе в рабочий лист и деактивировать его при выходе.

Однако многопоточное использование OpenGL обычно снижает производительность. В любом случае, есть кое-что, что может быть парализовано со стороны вызывающей стороны OpenGL API, поскольку порядок операций очень важен. Однако графический процессор отлично распараллелит все операции.

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

1 голос
/ 01 апреля 2011

Очереди не привязаны ни к какому конкретному нить исполнения

Нет гарантии, что все блоки, отправленные в последовательную очередь, будут отправлены в один и тот же поток. Вам необходимо использовать основную очередь для рендеринга или реализовать для очередей блоков в потоках с контекстом GL, используя NSThread или pthread в качестве основной очереди.

0 голосов
/ 27 марта 2011

Нет, извините, гарантии нет.

...