На MacOS X вы можете отобразить OpenGL для любого объекта NSView
по вашему выбору, просто создав NSOpenGLContext
, а затем набрав -setView:
. Однако вы можете связать одно представление только с одним контекстом OpenGL в любое время. Мой вопрос, если я хочу, чтобы сделать OpenGL в две различные точки зрения в пределах одного окна (или, возможно, в двух разных окнах), у меня есть два варианта:Вместо контекста контекста контекста OpenGL или контекста контекста контекста, что предпочтительнее?
Создать один контекст и всегда меняют мнение, позвонив по телефону
setView
в зависимости от ситуации каждый раз, когда я хочу отобразить другой вид. Это даже будет работать, если представления находятся в разных окнах или на разных экранах.Создайте два объекта
NSOpenGLContext
и сопоставьте один вид с одним из них. Эти два контекста могут быть разделены, что означает, что большинство ресурсов (например, текстуры, буферы и т. Д.) Будут доступны в обоих представлениях, не теряя в два раза больше памяти. Однако в этом случае я должен постоянно переключать текущий контекст каждый раз, когда хочу рендерить на другой вид, вызвав-makeCurrentContext
в правильном контексте перед выполнением любых вызовов OpenGL.
Я на самом деле использовали любой вариант в прошлом, каждый из них работал хорошо для моих потребностей, однако, я спрашивал себя, какой путь лучше с точки зрения производительности, совместимости, и так далее. Я читал, что переключение контекста на самом деле ужасно медленное, или, по крайней мере, оно было очень медленным в прошлом, возможно, изменилось между тем. Это может зависеть от того, сколько данных связано с контекстом (например, ресурсы), поскольку переключение активного контекста может привести к передаче данных между системной памятью и памятью GPU.
С другой стороны, изменение вида может быть очень медленным, особенно если это может привести к изменению основного визуализатора; например если ваши два представления являются частью двух разных окон, расположенных на двух разных экранах, которые управляются двумя различными графическими адаптерами. Даже если рендерер не изменяется, я не знаю, будет ли система выполнять дорогостоящую настройку/очистку OpenGL при переключении вида, например создание/уничтожение объектов рендеринга/фреймбуфера.
50 мс, они относятся к переключению GLContext или переключению целевых объектов? И если они относятся к первому, были ли контексты разделены или не разделены? – Mecki
Контексты были общими (обязательными), накладные расходы были более или менее устойчивыми и происходили от создания разных пар окон и визуализации контекстов, независимо от того, какой из них был изменен. Это измерение не может быть общей истиной, так как я не измерял накладные расходы переключения без общих данных или без ожидающих обратных вызовов. Возможно, вы можете измерить различия для обоих ваших подходов в своем конкретном случае (с рисунком или без него). – Sam
Ну, я попытался сравнить затраты на переключение контекста с помощью синтаксического теста, используя несимметричные контексты с одним ресурсом (очень большой текстурой) в каждом из них и без ожидающих запросов на рисование. В результате было доступно около 50 000 переключателей контекста в секунду. Это звучит довольно hgih, но его нужно взять с солью, так как, честно говоря, насколько реалистичен этот показатель? Какое приложение будет иметь такие небольшие ресурсы или никогда не будет ждать ожидающих запросов на рисование? Таким образом, ваш номер, вероятно, намного лучше, чем мой, по крайней мере, более реалистичный. – Mecki