2015-08-22 2 views
0

Я пытаюсь выяснить, нужно ли мне переделать поверхность, если я хочу вызвать метод attachToGLContext из SurfaceTexture. Я пытался посмотреть в документации по Android, но не упоминается.SurfaceTexture AttachToGLContext и Surface

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

Кто-нибудь знает наверняка?

ответ

2

Внутреннее название SurfaceTexture - «GLConsumer». Поверхности имеют отношения между производителем и потребителем, а SurfaceTexture - это потребитель, который получает все, что получает, и делает его доступным как текстура GLES.

Поверхность, прикрепленная к ней (обычно с использованием конструктора Surface, который принимает SurfaceTexture в качестве аргумента) является стороной производителя. Хотя существует очередь буферов, участвующих в связи между производителем и потребителем, не совсем точно описать поверхность как «буфер». Это больше похоже на конечную точку связи, которая отправляет графические данные потребителю.

Изменение контекста EGL, связанного с потребительской стороной, не будет влиять на сторону производителя. Прикрепление/отключение вызовов не отключает производителя. Они влияют только на то, что SurfaceTexture делает с буферами данных, которые он получает.

Однако довольно редко нужно использовать эти вызовы, и могут быть некоторые накладные расходы, связанные с манипулированием контекстами EGL, поэтому убедитесь, что это то, что вам нужно.

+0

Да, у меня есть служба, которая декодирует рамки медикакодека в поверхностном слое. У меня есть приложение с несколькими действиями, каждое из которых имеет различное количество поверхностей EGL. Таким образом, я могу прикрепить поверхностную структуру к различным EGLконтекстам из разных видов деятельности. Есть ли способ сохранить один и тот же контекст EGL и передать его от активности к активности с намерением? Я не знаю все последствия резьбы, если я попытаюсь это сделать. – Kongo

+0

Контекст EGL может быть только в одном потоке за раз. Если вы сохраните ссылку на нее в статической переменной, вы можете сделать ее неактивной в текущем потоке и отправить намерение, которое сообщает о следующем мероприятии «теперь это ваше». В качестве альтернативы, свяжите контекст EGL с потоком, который не умирает, и просто взаимодействуйте с каждым действием (через Looper/Handler). Обмен контекстом с другими людьми обычно является хорошей идеей - тогда вы можете ссылаться на внешнюю текстуру непосредственно в других контекстах. – fadden

+0

Я все еще немного размыта по номенклатуре. Контекст EGL - это EGLcore? И ваше второе предложение о потоке, который не умирает ... Я должен убедиться, что эта нить выполняет всю работу по рисованию и настройку да? Поэтому мне нужно, чтобы обработчик получал ссылки на surfaceTextures из действий, передавал их в поток, настраивал WindowSurfaces, вызывал makeCurrent(), а затем рисовал все в потоке. – Kongo

Смежные вопросы