EGLSurface 和 OpenGL ES
Android 使用 OpenGL ES (GLES) API 渲染图形。为了创建 GLES 上下文并为 GLES 渲染提供窗口系统,Android 使用 EGL 库。GLES 调用用于渲染纹理多边形,而 EGL 调用用于将渲染放到屏幕上。
在使用 GLES 进行绘制之前,您需要创建 GL 上下文。在 EGL 中,这意味着要创建一个 EGLContext 和一个 EGLSurface。 GLES 操作适用于当前上下文,该上下文通过线程局部存储访问,而不是作为参数进行传递。渲染代码应该在当前 GLES 线程(而不是界面线程)上执行。
EGLSurface
EGLSurface 可以是由 EGL 分配的离屏缓冲区(称为“pbuffer”),也可以是由操作系统分配的窗口。调用 eglCreateWindowSurface() 函数可创建 EGL 窗口 Surface。eglCreateWindowSurface() 将“窗口对象”作为参数,在 Android 上,该对象是 Surface。Surface 是 BufferQueue 的生产方端。消费方(SurfaceView、SurfaceTexture、TextureView 或 ImageReader)创建 Surface。当您调用 eglCreateWindowSurface() 时,EGL 将创建一个新的 EGLSurface 对象,并将其连接到窗口对象的 BufferQueue 的生产方接口。此后,渲染到该 EGLSurface 会导致一个缓冲区离开队列、进行渲染,然后排队等待消费方使用。
虽然窗口通常会显示,但是在这种情况下,EGLSurface 窗口的输出可能不会出现在屏幕上。
EGL 不提供锁定/解锁调用。您需要发出绘制命令,然后调用 eglSwapBuffers() 来提交当前帧。方法名称来自传统的前后缓冲区交换,但实际实现可能有所不同。
一个 Surface 一次只能与一个 EGLSurface 关联(您只能将一个生产方连接到一个 BufferQueue),但是如果您销毁该 EGLSurface,它将与该 BufferQueue 断开连接,并允许其他内容连接到该 BufferQueue。
通过更改“当前”EGLSurface,指定线程可在多个 EGLSurface 之间进行切换。一个 EGLSurface 一次只能在一个线程上处于当前状态。
EGL 不是 Surface 的另一方面(如 SurfaceHolder)。EGLSurface 是一个相关但独立的概念。您可以在没有 Surface 作为支持的 EGLSurface 上绘制,也可以在没有 EGL 的情况下使用 Surface。EGLSurface 只是为 GLES 提供一个绘制的地方。
ANativeWindow
公开的 Surface 类以 Java 编程语言实现。C/C++ 中的同等项是 ANATIONWindow 类,由 Android NDK 半公开。您可以使用 ANativeWindow_fromSurface() 调用从 Surface 获取 ANativeWindow。就像它的 Java 语言同等项一样,您可以对 ANativeWindow 进行锁定、以软件形式进行渲染,以及解锁并发布。基本的“原生窗口”类型是 BufferQueue 的生产方端。
如需从原生代码创建 EGL 窗口 Surface,可将 EGLNativeWindowType 的实例传递到 eglCreateWindowSurface()。EGLNativeWindowType 是 ANativeWindow 的同义词,因此可以互换使用。
相关文章
- RedisJson 横空出世,比 ES 快7 倍,惊爆了!
- 2022最新ES面试题整理(Elasticsearch面试指南系列)「建议收藏」
- es集群搭建_k8s和docker搭建es集群
- ES系列三、基本知识准备
- ES系列十之深入理解倒排索引
- OpenGL ES 着色语言
- ES(ElasticSearch)数据建模最佳实践之「一对多对多关系建模」
- 【ES三周年】ElasticSearch数据库简单介绍
- 【ES三周年】Linux安装ElasticSearch
- docker中安装es和kibana
- [ES三周年]Springboot 实现 ES-SQL 的流程
- IOS – OPenGL ES 设置图像亮度 GPUImageBrightnessFilter
- IOS – OpenGL ES 调节图像对比度 GPUImageContrastFilter
- IOS – OPenGL ES 调节图像伽马线 GPUImageGammaFilter
- IOS – OpenGL ES 调节图像反色 GPUImageColorInvertFilter
- IOS – OpenGL ES 调节图像不透明度 GPUImageOpacityFilter
- IOS – OpenGL ES 调节图像阴影 GPUImageHighlightShadowFilter
- IOS – OpenGL ES 调节图像单色 GPUImageMonochromeFilter
- 【ES三周年】ES最佳实践案例
- IOS – OpenGL ES 色彩丢失/模糊效果 GPUImageColorPackingFilter
- 【ES三周年】吊打ElasticSearch(入门保姆级教程-1)
- IOS – OpenGL ES 图像凹面镜移动效果 GPUImagePinchDistortionFilter
- IOS – OpenGL ES 图像水晶球效果 GPUImageGlassSphereFilter
- 【ES三周年】elasticsearch 核心概念
- 比较Redis与ES在查询方面的优劣(查询放redis还是es)
- 简单快捷ES数据导出到Oracle(es数据导出oracle)
- 比较ES与Oracle数据库异同与选择(es和oracle数据库)
- 数据存储看您选择ES还是Redis(数据存es还是redis)
- 比较ES和Redis的数据写入功能(写入es和写入redis)
- Oracle与ES协同同步实现最佳性能(oracle与es同步)