Вместо этого переключите контексты OpenGL или цель рендеринга контекста, что предпочтительнее?

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

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

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

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

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

6
задан Mecki 14 February 2012 в 18:59
поделиться