2012-02-14 5 views
6

На MacOS X вы можете отобразить OpenGL для любого объекта NSView по вашему выбору, просто создав NSOpenGLContext, а затем набрав -setView:. Однако вы можете связать одно представление только с одним контекстом OpenGL в любое время. Мой вопрос, если я хочу, чтобы сделать OpenGL в две различные точки зрения в пределах одного окна (или, возможно, в двух разных окнах), у меня есть два варианта:Вместо контекста контекста контекста OpenGL или контекста контекста контекста, что предпочтительнее?

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

  2. Создайте два объекта NSOpenGLContext и сопоставьте один вид с одним из них. Эти два контекста могут быть разделены, что означает, что большинство ресурсов (например, текстуры, буферы и т. Д.) Будут доступны в обоих представлениях, не теряя в два раза больше памяти. Однако в этом случае я должен постоянно переключать текущий контекст каждый раз, когда хочу рендерить на другой вид, вызвав -makeCurrentContext в правильном контексте перед выполнением любых вызовов OpenGL.

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

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

ответ

4

Я исследовал переключение контекста между 3 окнами на Lion, где я попытался решить некоторые проблемы с производительностью с помощью некорректной библиотеки VTK, которая сама по себе уже очень медленна.

Wether вы переключаете контексты рендеринга или окна на самом деле не имеют значения, , потому что всегда есть накладные расходы, чтобы оба они были текущими для вызывающего потока в виде тройки. Я измерил примерно 50 мс на коммутатор, где также заряжаются некоторые операционные расходы на OS/Window. Эти накладные расходы также сильно зависят от расположения других вызовов GL, потому что драйвер может быть вынужден дождаться завершения команд, что может быть достигнуто вручную блокирующим вызовом glFinish().

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

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

+0

50 мс, они относятся к переключению GLContext или переключению целевых объектов? И если они относятся к первому, были ли контексты разделены или не разделены? – Mecki

+0

Контексты были общими (обязательными), накладные расходы были более или менее устойчивыми и происходили от создания разных пар окон и визуализации контекстов, независимо от того, какой из них был изменен. Это измерение не может быть общей истиной, так как я не измерял накладные расходы переключения без общих данных или без ожидающих обратных вызовов. Возможно, вы можете измерить различия для обоих ваших подходов в своем конкретном случае (с рисунком или без него). – Sam

+2

Ну, я попытался сравнить затраты на переключение контекста с помощью синтаксического теста, используя несимметричные контексты с одним ресурсом (очень большой текстурой) в каждом из них и без ожидающих запросов на рисование. В результате было доступно около 50 000 переключателей контекста в секунду. Это звучит довольно hgih, но его нужно взять с солью, так как, честно говоря, насколько реалистичен этот показатель? Какое приложение будет иметь такие небольшие ресурсы или никогда не будет ждать ожидающих запросов на рисование? Таким образом, ваш номер, вероятно, намного лучше, чем мой, по крайней мере, более реалистичный. – Mecki

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