Android 图形系统
文章平均质量分 90
hanpfei
实时音视频开发。
展开
-
在 Android 中使用 OpenGL
Android 通过 OpenGL 包含了对高性能 2D 和 3D 图形的支持,特别是 OpenGL ES API。OpenGL 是一个跨平台的图形 API,它为 3D 图形处理硬件规定了一个标准的软件接口。OpenGL ES 是一种用于嵌入式设备的 OpenGL 规范。Android 支持多种版本的 OpenGL ES API:OpenGL ES 1.0 和 1.1 - Android 1.0原创 2017-09-15 14:09:04 · 1368 阅读 · 0 评论 -
Android 图形系统之图形缓冲区分配
BufferQueue 是 Android 中所有图形处理操作的核心。它的作用很简单:将生成图形数据缓冲区的一方(生产者)连接到接受数据以显示或进一步处理的一方(消费者)。几乎所有在系统中移动图形数据缓冲区的内容都依赖于 BufferQueue。Android 定义了一个类 BufferQueue,用于创建 BufferQueue、生产者和消费者。该类定义(位于frameworks/native/i原创 2017-09-21 16:06:03 · 2059 阅读 · 0 评论 -
Android 图形系统
Android framework 为2D 和 3D 提供了各种各样的图形渲染 APIs 来与设备制造商的图形驱动实现交互,因此对于那些 API 在上层如何工作有一个好的理解非常重要。这一页介绍驱动基于其构建的图形硬件抽象层 (HAL)。应用程序开发者以两种方式将图像绘制到屏幕上:通过 Canvas 或 OpenGL。参考 系统级图形架构 来了解 Android 图形组件的详细描述。andro原创 2017-08-17 10:39:17 · 977 阅读 · 0 评论 -
BufferQueue 和 gralloc
理解 Android 图形系统,我们从场景背后的 BufferQueue 和 gralloc HAL 开始。BufferQueue 类是 Android 中所有图形的核心。它的角色很简单:连接产生图形数据缓冲区的东西(生产者)和接受数据来显示或进一步处理的东西(消费者)。几乎所有在系统中移动图形数据缓冲区的东西都依赖于 BufferQueue。gralloc 内存分配器执行缓冲区分配,且通过一原创 2017-08-17 10:39:23 · 610 阅读 · 0 评论 -
SurfaceFlinger 和 Hardware Composer
拥有图形数据缓冲区是很精彩的,但是当你在你的设备屏幕上看到它们时生活甚至更美好。那就是 SurfaceFlinger 和 Hardware Composer HAL 做的事情。SurfaceFlingerSurfaceFlinger 的角色是接收来自于多个源的数据缓冲区,组合它们,并将它们发送给显示设备。曾经一段时期这是通过软将数据块传送到硬件 framebuffer (比如 /dev/gra原创 2017-08-17 10:39:32 · 1923 阅读 · 0 评论 -
Surface 和 SurfaceHolder
Surface 类自 1.0 版本开始就是公共 API 的一部分了。它的描述简单地说,“处理由屏幕合成器管理的原始缓冲区”。该陈述在最初编写时是准确的,但在现代系统上却与事实相去甚远。Surface 表示一个常常(但不总是!)由 SurfaceFlinger 消费的 buffer queue 的生产者端。当你渲染到 Surface 上时,结果最终将进入被传递给消费者的缓冲区中。Surface 不原创 2017-08-17 10:39:34 · 2292 阅读 · 0 评论 -
EGLSurfaces 和 OpenGL ES
OpenGL ES 定义了一个渲染图形的 API。它没有定义窗口系统。为了使 GLES 可以工作于各种平台之上,它被设计为与知道如何通过操作系统创建和访问窗口的库相结合。Android 使用的库称为 EGL。如果你想绘制纹理多边形,你使用 GLES 调用;如果你想将渲染的东西放在屏幕上,则使用 EGL 调用。在你可以通过 GLES 做任何事情之前,你需要创建一个 GL 上下文。在 EGL 中,这原创 2017-08-17 10:39:37 · 1645 阅读 · 0 评论 -
Vulkan
Android 7.0 添加了对 Vulkan 的支持,一个高性能 3D 图形的低开销跨平台 API。像 OpenGL ES 一样,Vulkan 提供了在应用中创建高质量,实时图形的工具。Vulkan 的优势包括 CPU 开销降低及支持 SPIR-V Binary Intermediate 语言。片上系统生产商(SoCs)比如 GPU 独立硬件供应商(IHVs)可以为 Android 编写 Vu原创 2017-08-17 10:39:40 · 923 阅读 · 0 评论 -
SurfaceView 和 GLSurfaceView
Android 应用框架 UI 是基于一个从 View 开始的对象层次体系的。所有的 UI 元素经历一个复杂的测量和布局过程来将它们适配入一个矩形区域,所有可见的 View 对象被渲染进一个 SurfaceFlinger 创建的 Surface,而后者由 WindowManager 在应用程序回到前台时建立。应用程序的 UI 线程执行布局并渲染进一个单独的缓冲区(无论 Layouts 和 View原创 2017-08-17 10:39:42 · 666 阅读 · 0 评论 -
SurfaceTexture
SurfaceTexture 类是在 Android 3.0 中引入的。就像 SurfaceView 是 Surface 和 View 的结合一样,SurfaceTexture 是 Surface 和 GLES texture 的粗糙结合(有几个警告)。当你创建了一个 SurfaceTexture,你就创建了你的应用作为消费者的 BufferQueue。当一个新的缓冲区由生产者入对时,你的应用将原创 2017-08-17 10:39:45 · 8525 阅读 · 3 评论 -
TextureView
TextureView 类是在 Android 4.0 中引入的,且是这里讨论的最复杂的 View 对象,它结合了 View 和 SurfaceTexture。用 GLES 渲染回忆一下,SurfaceTexture 是一个 "GL 消费者",消费图形数据缓冲区并使其可用作纹理。TextureView 封装了一个 SurfaceTexture,并接管了响应回调和获取新缓冲区的职责。新缓冲区的到原创 2017-08-17 10:39:48 · 1216 阅读 · 0 评论 -
游戏循环
实现一个游戏的一种非常流行的方式看起来像这样:while (playing) { advance state by one frame render the new frame sleep until it’s time to do the next frame}这种方式有几个问题,最基本的是游戏可以定义什么是 “帧” 的想法。不同的显示器将以不同的频率刷新,且频率可原创 2017-08-17 10:39:51 · 385 阅读 · 0 评论 -
Android 硬件 OpenGL ES 模拟设计概述
简介Android 平台的 OpenGL ES 模拟由多个组件实现,它们是:一些宿主机的 “翻译器” 库。它们实现了由 Khronos 定义的 EGL,GLES 1.1 和 GLES 2.0 ABIs,并把对应的函数调用翻译为适当的桌面 API,比如:实现 EGL 接口的是 GLX (Linux),AGL (OS X) 或 WGL (Windows)实现 GLES 1.1 和 GLES 2.0翻译 2017-09-16 15:43:01 · 2205 阅读 · 0 评论 -
EGL Context 创建
继续 EGL context 创建的分析。eglInitialize()来看 EGL10.eglInitialize() 的实现。com.google.android.gles_jni.EGLImpl 中,这个方法的实现如下: public native boolean eglInitialize(EGLDisplay display, int[] major_minor);它是一个本原创 2017-09-15 14:11:02 · 1870 阅读 · 0 评论 -
Android 图形驱动初始化
从应用程序的角度看 OpenGL 图形系统的接口,主要包括两大部分,一部分是 EGL,它为 OpenGL 渲染准备环境;另一部分是 OpenGL,它执行图形渲染。通过这些接口构造渲染环境,并执行渲染的过程,可以参考 在 Android 中使用 OpenGL。对于 Android OpenGL 图形系统的实现的分析,从 EGL context 的创建开始。先来看一下获取 Display 的过程。首先来原创 2017-09-15 14:09:46 · 1402 阅读 · 2 评论 -
Android 图形系统之gralloc
Gralloc1::Loader 与 gralloc 模块加载Gralloc1::Loader 用于加载 HAL gralloc 模块。其类定义(位于 frameworks/native/include/ui/Gralloc1.h)如下:class Loader{public: Loader(); ~Loader(); std::unique_ptr<Device> get原创 2017-09-21 16:06:49 · 3333 阅读 · 0 评论