Стоимость переключения между многими EAGLContexts?

Я работаю над кодом, который имеет вид сетки (~20 дочерних видов на экране одновременно). Каждый дочерний вид рисует свое содержимое в GL и имеет свой собственный поток рисования и EAGLContext.

Преимущество этого состоит в том, что каждое представление относительно изолировано от другого использования GL в приложении, хотя с 20 такими представлениями на экране мы должны glFlush+setCurrentContext: 20 раз за кадр. Моя интуиция говорит мне, что это не самое эффективное использование GL.

Мои вопросы:

  • Какова стоимость переключения контекстов?
  • Замедляет ли необходимость glFlush для каждого контекста, или glFlush только останавливает текущий контекст?

2 ответа

Стоимость переключения контекстов очень зависит от оборудования. Более новые поколения оборудования имеют тенденцию иметь более эффективную поддержку переключения контекста. Но это в любом случае довольно тяжелая операция.

Стоимость glFlush не очень маленький и не очень большой. Не то, что вы хотите делать чаще, чем нужно, но не очень вредно при использовании в меру. Я был бы гораздо более обеспокоен переключением контекста, чем сбросом. Как отметил Андон в своем ответе, glFlush не будет достаточно, если вам нужна синхронизация между контекстами / потоками. Это потребует либо glFinishили какой-то забор.

С вашей настройкой у вас также будет цена за переключатели потоков на процессоре.

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

Чтобы сделать этот ответ более самодостаточным, с благодарностью Андону: вам не нужно делать вызовы для установки текущего контекста, поскольку текущий контекст поддерживается для каждого потока. Но на уровне графического процессора все равно будут происходить переключение контекста, как только будет представлена ​​работа из нескольких контекстов.

• Замедляет ли необходимость glFlush для каждого контекста на самом деле, или glFlush только останавливает текущий контекст?

Контексты имеют свои отдельные потоки команд.

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

К счастью, GL не гарантирует какой-либо синхронизации между различными контекстами, поэтому сам GL не собирается тратить много усилий на то, чтобы команды из разных контекстов выполнялись в определенном порядке относительно друг друга. Тем не менее, если вы ожидаете синхронизации на заборе. Затем объект, связанный с другим контекстом в одном из потоков команд, привел бы к некоторым интересным накладным расходам, связанным с GL.

• Какова стоимость переключения контекстов?

Почему вы меняете контексты?

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

Другие вопросы по тегам