Внутреннее название SurfaceTexture - «GLConsumer». Поверхности имеют отношения между производителем и потребителем, а SurfaceTexture - это потребитель, который получает все, что получает, и делает его доступным как текстура GLES.
Поверхность, прикрепленная к ней (обычно с использованием конструктора Surface, который принимает SurfaceTexture в качестве аргумента) является стороной производителя. Хотя существует очередь буферов, участвующих в связи между производителем и потребителем, не совсем точно описать поверхность как «буфер». Это больше похоже на конечную точку связи, которая отправляет графические данные потребителю.
Изменение контекста EGL, связанного с потребительской стороной, не будет влиять на сторону производителя. Прикрепление/отключение вызовов не отключает производителя. Они влияют только на то, что SurfaceTexture делает с буферами данных, которые он получает.
Однако довольно редко нужно использовать эти вызовы, и могут быть некоторые накладные расходы, связанные с манипулированием контекстами EGL, поэтому убедитесь, что это то, что вам нужно.
Да, у меня есть служба, которая декодирует рамки медикакодека в поверхностном слое. У меня есть приложение с несколькими действиями, каждое из которых имеет различное количество поверхностей EGL. Таким образом, я могу прикрепить поверхностную структуру к различным EGLконтекстам из разных видов деятельности. Есть ли способ сохранить один и тот же контекст EGL и передать его от активности к активности с намерением? Я не знаю все последствия резьбы, если я попытаюсь это сделать. – Kongo
Контекст EGL может быть только в одном потоке за раз. Если вы сохраните ссылку на нее в статической переменной, вы можете сделать ее неактивной в текущем потоке и отправить намерение, которое сообщает о следующем мероприятии «теперь это ваше». В качестве альтернативы, свяжите контекст EGL с потоком, который не умирает, и просто взаимодействуйте с каждым действием (через Looper/Handler). Обмен контекстом с другими людьми обычно является хорошей идеей - тогда вы можете ссылаться на внешнюю текстуру непосредственно в других контекстах. – fadden
Я все еще немного размыта по номенклатуре. Контекст EGL - это EGLcore? И ваше второе предложение о потоке, который не умирает ... Я должен убедиться, что эта нить выполняет всю работу по рисованию и настройку да? Поэтому мне нужно, чтобы обработчик получал ссылки на surfaceTextures из действий, передавал их в поток, настраивал WindowSurfaces, вызывал makeCurrent(), а затем рисовал все в потоке. – Kongo