Android图形显示
文章平均质量分 85
夕阳叹
The best way to predict the future is to create it.
展开
-
Skia深入分析1——skia上下文
前言: 断断续续跟Android的skia库打了两年交道,如今交接掉了,便写写关于skia的一些知识,也算了结一段职业生涯。找了找网上关于skia的文章,基本上都过时了,讲得也不怎么深入。虽然Skia只是一个2D引擎,但其深度优化的算法、完善的渲染体系和精炼的代码框架,还是很值得借鉴的。 PS:文章所依据的代码为目前最新的Android 5.0.2。原创 2015-01-10 01:21:56 · 12503 阅读 · 2 评论 -
Android图形显示系统——上层显示2:硬件加速实现
Android界面绘制的硬件加速实现Android的界面绘制的硬件加速采取上下整合的一套流程实现一、代码结构(一)JavaHardwareRenderer->ThreadedRenderer:组织硬件加速渲染的类,下发创建显示列表和回放的指令。 GLES20RecordngCanvas GLES20Canvas HardWareCanvas:与Canvas平级的UI渲染引擎支持,但这个Canvas原创 2015-10-13 01:13:44 · 5661 阅读 · 0 评论 -
Skia深入分析3——skia图片绘制的实现(2)
此篇讲图像采样一、采样流程在上一节里的流程图有写到,图像绘制的实际渲染发生在某个blitter的blitRect函数中,我们先看一个具体的blitRect实现。void SkARGB32_Shader_Blitter::blitRect(int x, int y, int width, int height) { SkASSERT(x >= 0 && y >= 0 &&原创 2015-02-02 22:17:46 · 4334 阅读 · 0 评论 -
ETC1压缩纹理格式详解
本来以为,ETC1作为Android 设备的OpenGL标准,开源且最常用的的一种压缩纹理格式,总会有人去翻译一下khronos的文档,读一下代码,给大家作个普及的,不料就是搜不到。没办法,尽管英文不好,还是硬啃了下文档,把 ETC1压缩纹理的实现原理弄清楚了。 https://www.khronos.org/registry/gles/extensions/OES/OES_compressed_原创 2015-10-14 11:17:36 · 17920 阅读 · 1 评论 -
Android图形显示系统——概述
序Android的图形显示系统,虽然感觉自己基本了解了,有问题基本都能解决,但要写时,一是觉得千头万绪无从下笔,一是发现还有很多并没有真正搞懂。开工写这套体系,也顺便查漏补缺下。Android图形显示系统的剖分图形显示系统就像一个报社,它派出记者去采访,记者写成文稿后,将记者们交上来的文稿审核、排版、印刷,最终形成一期又一期报纸。 如上是Android图形显示系统的一个全貌图,以中间那条线为界,划原创 2015-12-28 21:40:30 · 9338 阅读 · 4 评论 -
Android图形显示系统——一张图片的显示流程
Android设备上一张图片的显示过程应用示例假如我们现在有一张这样的风景照 想在Android设备(比如一个小米pad)上显示出来。首先想到的是写一个应用,用一个ImageView,把这张照片附到ImageView上显示,如下面的demo。 MainActivity.javapackage com.example.pictureshow;import android.app.Activit原创 2016-01-20 23:56:45 · 14779 阅读 · 5 评论 -
Android图形显示系统——上层显示1:界面绘制大纲
Android显示之应用界面绘制越到上层,跟业务关联越直接,代码就越繁杂,Android上层显示的代码正是如此。此外,java语言本身繁复的特点(比C语言多了满屏的try-catch,比C++少了析构处理的优雅简洁,和更高级的语言scala、python等就别比了),更加剧了这一现象。 直接去看代码,往往会看得一头雾水,知其然而不知其所以然。在这时候,就要把代码扔掉,仔细去理清需要实现什么,怎么实原创 2015-08-23 00:00:43 · 7440 阅读 · 6 评论 -
Skia深入分析7——区域解码
Skia深入分析7——区域解码1、概述 -当图片很大时,解码速度缓慢,占用内存很高,并且,当图片超过一定尺寸时,无法做纹理上传和显示(这跟GPU能力有关,一般的GPU是8192*8192)。这时只好做下采样,但会牺牲图片显示的质量。 -对于图库等需要清晰浏览图片的应用,不可能设置一个下采样率去解决这一问题,因此,Google加入了区域解码这个功能,使我们可以从原始的图片文件中,解出一部分区域完整原创 2015-02-27 22:49:26 · 3750 阅读 · 1 评论 -
Skia深入分析6——skia中图像编解码代码概述
1、API和自注册机制Skia中编码解码图片都只需要一行代码:解码:SkBitmap bitmap;SkImageDecoder::DecodeFile("test.xxx", &bitmap);//由文件名解码,自动推断图片类型//或者由流解码SkFILEStream stream("test.xxx");SkImageDecoder::DecodeStream(stream原创 2015-02-26 23:39:11 · 6326 阅读 · 13 评论 -
OpenGL的替代者——Vulkan
OpenGL的替代者——VulkanVulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯(Khronos)组织在2015年游戏开发者大会(GDC)上发表。旨在替代OpenGL,提高图形性能。基于OpenGL的图形引擎性能瓶颈基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。 资源加载这一过程跟GPU没有原创 2016-12-20 15:45:30 · 19205 阅读 · 0 评论 -
3D文件压缩库——Draco简析
3D文件压缩库——Draco简析今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析。注:Draco 代码地址: https://github.com/google/draco基本使用编译cmake . + make 编译源码,生成 draco_encoder 和 draco_decoder 两个可执行文件原创 2017-02-24 14:21:26 · 15990 阅读 · 5 评论 -
Android中读图片Exif信息的方法
Exif读取类Android提供了读取写入Exif的API,但很可惜,这个API只能由指定文件名读取、写入Exif,效率低得可怜。 不得已,把Android系统代码里图库的一段摘了过来。 有Android源码的看源码中 packages/apps/Gallery2/ 部分, 没有或者图方便的直接看这里: https://github.com/jxt1234/ThirdPartyUsefulC原创 2015-07-30 17:48:42 · 3381 阅读 · 0 评论 -
Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)
Android显示之图层合成要点1.图层合成指综合各个窗口的绘制内容,送往LCD显示的过程。从原理上可分为在线合成与离线合成两种方式。 2.在Android的SurfaceFlinger代码流程中,图层合成方式分3D合成(OpenGL)和硬件合成两大类。 3.图形系统采用垂直同步Vsync机制,由LCD上报vsync,触发图层合成。图层合成的原理什么是图层合成以Android原生版本的Launc原创 2015-05-27 23:44:09 · 17687 阅读 · 6 评论 -
Skia深入分析2——skia渲染架构
一、渲染层级从渲染流程上分,Skia可分为如下三个层级:1、指令层:SkPicture、SkDeferredCanvas->SkCanvas这一层决定需要执行哪些绘图操作,绘图操作的预变换矩阵,当前裁剪区域,绘图操作产生在哪些layer上,Layer的生成与合并。2、解析层:SkBitmapDevice->SkDraw->SkScan、SkDraw1Glyph::Proc这一层原创 2015-01-17 01:38:20 · 9617 阅读 · 2 评论 -
Skia深入分析4——skia路径绘制的实现
Skia路径绘制代码分析路径绘制尽管使用频率相对于图像绘制、文本绘制低,但却是非常重要的一个基本特性。所有不规则图形(椭圆、圆角矩形、三角形、简单的文字),最后都避不开路径绘制。而且,若自己实现一个2D引擎,这块内容是很具有参考意义的,用OpenGL的话,图像采样等都很少关注了,对对坐标就好。但菱角、圆弧、曲线等如何绘制仍然是一个难题,这时就可以参考Skia中drawPath的实现。由原创 2015-02-10 00:06:16 · 5628 阅读 · 0 评论 -
Skia深入分析5——skia文字绘制的实现
文字绘制主要包括编码转换(主要是中文)、字形解析(点线或image)和实际渲染三个步骤。在这个过程中,字形解析和实际渲染均是耗时步骤。Skia对文字解析的结果做了一套缓存机制。在中文字较多,使用多种字体,绘制的样式(粗/斜体)有变化时,这个缓存会变得很大,因此Skia文字缓存做了内存上的限制。1、SkPaint文字绘制与SkPaint的属性相关很大,先回头看下SkPaint相关的属性原创 2015-02-18 19:55:05 · 6524 阅读 · 9 评论 -
Skia深入分析3——skia图片绘制的实现(1)
此篇讲Skia绘制图片的流程,在下一篇讲图像采样原理、混合和抖动技术1、API用法(1)drawBitmapvoid drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint = NULL);将bitmap画到x,y的位置(这本身是一个平移,需要和SkCanvas中的矩阵原创 2015-01-24 01:33:43 · 7350 阅读 · 0 评论 -
Skia深入分析9——延迟渲染和显示列表
概念Android的硬件加速,是先将绘制命令存储起来,然后回放,作为软件绘制的引擎Skia中同样有这样的机制。在Android 4.4的版本中又加入了延迟渲染的Canvas,它相当于默认使用显示列表的Canvas。 先得到显示列表,再进行渲染,便有机会基于绘制API的整体情况做优化调度。比如使用GPU加速,裁剪过度绘制等。从原理上看,很可能在这一层级做比较大的效率提升,不过,由于Android既定原创 2015-03-05 01:33:33 · 4273 阅读 · 2 评论 -
Skia深入分析10——Skia库的性能与优化潜力
Skia库性能分析图形/渲染作为图形渲染引擎,性能上是非常重要的,按通常Android手机60帧的刷新率,绘制一帧的总时间只有16ms,可谓是毫厘必争。提升性能到最后,就必然跟硬件打交道,适配CPU,毕竟一个SIMD做下去,好做的提升5、6倍,不那么好做的也达到2、3倍,收益极其可观。 使用SIMD,需要代码架构是满足内存连续性要求的,否则需要重构,Skia作为正常的图形渲染引擎,采用行渲染方式,原创 2015-03-06 22:03:03 · 5380 阅读 · 0 评论 -
Android图形显示系统——下层显示1:基础知识与相关文件
基础知识和相关文件基础知识Android下层显示相关的代码相对而言并不是很多,核心部分在三件厂商或SOC厂商提供/集成的驱动之中。尽管如此,这部分代码涉及到一系列基础类库,不了解的话也很难读懂。 这些基础知识这里只做简单介绍,详细了解看链接或可自行百度或Googlebinder/ServiceAndroid中用于进程间通信的基本方法,需要了解它是怎么使用的,不然会搞不明白surfaceflinge原创 2015-03-21 00:24:39 · 4034 阅读 · 1 评论 -
Android图形显示系统——下层显示2:图形内存的申请与显示
图形内存的申请与显示这一篇回答序言中的第一个问题: 如何申请可以用来送显的内存,如何将其送往LCD?要点图形内存是进程共享内存,且根据其标志支持不同硬件设备的读与写。buffer_handle_t 是 *private_handle_t,gralloc模块自定义private_handle_t类型,并实现图形内存的实际申请。GraphicBuffer跨进程共享的流程是用binder传输必要信原创 2015-03-21 01:44:37 · 6475 阅读 · 3 评论 -
Android图形显示系统——下层显示3:窗口系统
Android之窗口系统要点1.Android窗口系统通过C-S架构和一套Buffer循环机制实现,在保证安全稳定的前提下基本上做到了极致性能(无大块内存拷贝,IPC通信内容最少)。 2.Surface是皮,BufferQueue是肉,通过这样的皮肉关系构建了Buffer循环机制。Buffer循环机制不仅用于窗口系统,也用于视频播放解码流,相机拍照数据流等(Camera2.0架构)。 3.Sur原创 2015-04-02 01:21:27 · 6355 阅读 · 0 评论 -
Android图形显示系统——下层显示4:图层合成下(硬件合成器)
硬件合成器-HwComposer使用3D合成,需要大面积的像素混合计算和大量的内存传输(GPU读写GraphicBuffer所需),对GPU和DDR来说是一个巨大的负担。在GPU/DDR重度使用的场景(比如玩游戏),会造成发热、卡顿等。 为了提升性能,减少功耗,可以将合成这个过程交由另一个芯片完成,减轻GPU负担。进一步,直接让这个芯片连LCD,在LCD需要显示某一行时在线合成。 HwCompo原创 2015-06-08 03:19:47 · 9496 阅读 · 0 评论 -
Skia深入分析8——Skia的GPU绘图
Skia的GPU绘图一、Skia-GPU概述在Android4.2到Android5.0的过程中,skia中开发较频繁的部分莫过于GPU加速部分和延迟渲染机制,尽管目前来看几乎没有用到,但后续很可能会在Frameworks层引入。 在Android上面,只可能使用OpenGL,因此作为使用OpenGL的绘图引擎,关注如下要点即可: 1、OpenGL上下文如何建立(关系到如何显示绘制结果) 2、原创 2015-03-01 21:56:45 · 13280 阅读 · 3 评论