Является ли OpenGL потоком для нескольких потоков с различными контекстами?

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

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

Иными словами, до тех пор, пока контексты различны, могут ли два потока "совместно" использовать API C и, следовательно, графический процессор? Или это неотъемлемо то, что невозможно понять? Или это конкретная реализация?

Задача специально для OpenGL ES на iOS, но это, вероятно, общий вопрос GL.

Ответ 1

Да, вам нужно использовать один контекст для каждого потока, с которым вы хотите использовать OpenGL, а также вы можете обмениваться объектами между контекстами. Это путь:)

Ответ 2

Вариант 1. Если вы не используете контекст двумя потоками одновременно, достаточно одного контекста.

Вариант 2. Если вам нужно использовать OpenGL несколькими потоками одновременно, вам нужно больше одного контекста. Затем, если контексты разделяют их Sharegroup, они делят свой контент OpenGL, например, текстуры. Таким образом, вы можете загружать текстуры или выполнять тяжелую обработку фреймбуфера в фоновом потоке.

Посмотрите на последний раздел о Sharegroups здесь: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html

Вариант 3: GLKit обеспечивает некоторую встроенную фоновую обработку, например асинхронную загрузку текстуры через GLKTextureLoader - textureWithContentsOfFile. Я не знаю всех параметров, но это определенно упрощает некоторые случаи использования асинхронного OpenGL.