Ответ 1
quixoto комментарий ближе всего, я думаю. Традиционная причина, по которой контексты OpenGL являются конкретными потоками практически на каждой платформе, заключается в том, что OpenGL сильно зависит от состояний и не имеет семантики для создания серии изменений атомарных. Так, например, операция рисования на одном потоке может быть:
glVertexPointer(... supply vertex positions ...)
glTexCoordPointer(... provide texture positions ...)
/* and supply a few other pointers, maybe bind a texture */
glDrawArrays(... draw some geometry ...)
Таким образом, окончательный вызов обеспечивает прогнозируемые результаты только в контексте предыдущих вызовов. Если вы разрешите, чтобы этот бит кода был приостановлен после, скажем, glVertexPointer
, другой поток, прыгающий и выполняющий почти ту же последовательность, чтобы нарисовать свою геометрию, а затем этот код продолжит, он будет рисовать с совершенно неправильной геометрией, возможно даже вызывая доступ к памяти вне границ, если некоторые из замененных массивов меньше оригиналов.
Android предоставляет EGL, который поддерживает общую концепцию общей группы OpenGL (хотя и неявно, вы предоставляете существующий контекст, в котором вы хотите, чтобы новый контекст находился в общей группе с помощью третьего аргумента eglCreateContext
). Если в общей группе присутствуют два контекста, то каждый из них имеет независимое состояние и безопасен для вызова только из одного потока, но для каждого из них доступны именованные объекты, такие как текстуры или объекты буфера вершин. Таким образом, используя общие группы, вы можете одновременно выполнять действия OpenGL для нескольких потоков, чтобы иметь возможность комбинировать результаты в одном потоке.
Связывание контекста с одним потоком, следовательно, не является проблемой. Планирование проблемы в самом OpenGL также было бы не стартером, потому что часть причины, в которой контексты OpenGL создаются, управляются и удаляются в соответствии с ОС, - это то, что некоторые ОС должны обрабатывать этот материал радикально по-разному для других или могут предлагать лучшие решения, раскрывая свои собственные уникальные решения.