SurfaceTexture
SurfaceTexture 클래스는 Android 3.0에 도입되었습니다. SurfaceView가 Surface와 View의 조합 인 것처럼 SurfaceTexture는 대략적으로 따지자면 Surface와 GLES 텍스처의 조합입니다.
SurfaceTexture를 만들 때 BufferQueue를 생성하게됩니다. 새로운 버퍼가 큐에 저장되면 앱은 콜백 (onFrameAvailable ())을 통해 콜백을 받습니다. 이때 updateTexImage()를 호출하게되는데, 이 버퍼는 이전에 보유한 버퍼를 릴리즈하고 대기열에서 새 버퍼를 가져 오며 일부 EGL 호출을 만들어 버퍼를 GLES에서 외부 텍스처로 사용할 수 있도록합니다.
External Texture
외부 텍스처 (GL_TEXTURE_EXTERNAL_OES)는 GLES (GL_TEXTURE_2D)에서 만든 텍스처와 완전히 다릅니다. 렌더러를 조금 다르게 구성해야하며, 수행 할 수 없는 작업이 있습니다. 요점은 BufferQueue가받은 데이터에서 직접 폴리곤을 렌더링 할 수 있다는 것입니다. gralloc은 다양한 포맷을 지원하는데, 버퍼에있는 데이터의 형식이 GLES가 인식 할 수 있는것을 보장해야합니다. 그렇게하기 위해 SurfaceTexture가 BufferQueue를 생성 할 때 소비자 사용 플래그를 GRALLOC_USAGE_HW_TEXTURE로 설정하여 gralloc로 만든 버퍼를 GLES가 사용할 수 있도록합니다.
SurfaceTexture는 EGL 컨텍스트와 상호 작용하기 때문에 클래스 문서에 설명 된대로 올바른 스레드에서 해당 메서드를 호출해야합니다.
SurfaceTexture 와 Surface
API를 살펴보면 애플리케이션이 Surface를 생성하는 유일한 방법은 SurfaceTexture를 인자로 하는 생성자를 사용하는 것입니다. (API 11 이전에는 Surface에 대한 public 생성자가 전혀 없었습니다.) SurfaceTexture를 Surface와 텍스처의 조합으로 보는 경우 약간 뒤로 보일 수 있습니다.
반면 SurfaceTexture는 GLConsumer라고 불리며, 이는 BufferQueue의 소유자이자 Consumer 역할을보다 정확히 반영합니다. SurfaceTexture에서 Surface를 만들 때, SurfaceTexture의 BufferQueue의 Producer 측을 나타내는 객체를 생성하는 것입니다.
0개의 댓글