文档章节

Skia深入分析1——skia上下文

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 1036
阅读 91
收藏 1

前言:

        断断续续跟Android的skia库打了两年交道,如今交接掉了,便写写关于skia的一些知识,也算了结一段职业生涯。
找了找网上关于skia的文章,基本上都过时了,讲得也不怎么深入。虽然Skia只是一个2D引擎,但其深度优化的算法、完善的渲染体系和精炼的代码框架,还是很值得借鉴的。

        PS:文章所依据的代码为目前最新的Android 5.0.2。

基本章节规划如下:
1、Skia的上下文(即本章)
2、Skia基本渲染流程与框架
3、Skia图像绘制分析
4、Skia路径绘制分析
5、Skia文本绘制分析
6、Skia编解码架构分析

7、区域解码分析
8、Skia-gpu简介
9、Skia的性能瓶颈分析
10、延迟渲染机制


一、Skia在Android中的地位

1、规定2D绘制API
2、规定图像数据结构
3、承担编解码调度和软件渲染职责

二、Android系统中主要使用Skia的场景


Skia调用关系简图


1、界面绘制(lockCanvas——draw——unlockCanvas流程)
(1)UI控件,未开启硬件加速。由performTravelsals——drawSoftware调入。
Android显示系统是最复杂的Android最复杂的子系统,没有之一,这里只说明软件绘制时的一个基本过程:
a、计算布局,看是否需要更新View。
b、计算所有需要更新的View的区域,计算其最小外包矩形,即dirtyRect
c、由Surface去Lock一个Canvas,Lock时指定dirtyRect,这里涉及gui的buffer轮换机制,会去获取一块未在显示的Buffer,由于换了buffer,在gui模块会去拷贝上一帧非dirtyRect的部分。
d、执行根View的draw方法,递归调用所有子View的onDraw方法。由于Canvas对应的是软件绘制的canvas,所有绘制操作经过Canvas——SkiaCanvas——SkCanvas的流程,由skia引擎执行。(AndroidL上在jni(libandroid_runtime)处作了一层SkiaCanvas的封装,4.4及以前是Canvas——SkCanvas)
e、完成绘制,让Surface去unlockCanvas,将绘制好的Buffer送显。
(2)SurfaceView,这个是由应用显式实现lockCanvas——draw——unlockCanvas流程。

2、图像处理
这种情况下,开发者自行基于目标Bitmap创建Canvas,调用Canvas的API绘制图像,一般是作图像的缩放、旋转处理,也可以加入渐变特效。(不是 lockCanvas 或 继承 onDraw 方法中传入的Canvas,就别想拿去上屏了)
3、图像编解码
Skia对各种类型的图片作了适配,提供统一的接口,开发者调用BitmapFactory,BitmapFactory进一步调用jni——skia。
(1)关于图像全解,这部分调用逻辑看上去简单,实际上对于输入输出流的处理还是比较复杂的,涉及Java的流——Skia规定的流——对应解码库的流两重转换。
(2)关于区域解码,这部分是google为平衡内存——性能——显示速度而设计的方案,一些Android机器上的图库打开照片时有一块一块渐渐清晰的过程,就是区域解码然后局部刷新的结果。
区域解码分成两步:
a、创建tileIndex,以便查找某个区域所对应的码流位置。
b、解码:输入指定区域,按照tileIndex查找对应码流,将对应区域的图片解出来,这个过程一般会调用多次。

4、番外:webview软件渲染
由于libchromeview将libskia以静态方法集成进去,便跟系统的skia库没什么关系了。对Android系统而言是统一的webview显示框架。


三、skia相关的库简介

Skia相关模块

1、调用skia的库
libandroid_runtime:framework.jar的jni实现,链接framework和lib库的桥梁
hwui:2D硬件加速库,使用skia的数据格式
libchromeview:浏览器引擎,webview相关


2、Skia使用的库

(1)图片编解码库
libjpeg
libpng
libgif
webp
(2)字体解析
freetype
具体内容会在后续章节中讲述。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
jxt1234
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
私信 提问
Skia构建系统与编译脚本分析

版权声明:本文为foruok原创文章,转载请通过订阅号“程序视界”联系foruok获取授权。 https://blog.csdn.net/foruok/article/details/50699101 分析下Skia的构建系统,具体编译过程参看Win...

foruok
2016/02/19
0
0
Google 图形处理引擎--Skia

skia是个2D向量图形处理函数库,包含字型、座标转换,以及点阵图都有高效能且简洁的表现。不仅用于Google Chrome浏览器,新兴的Android开放手机平台也采用skia作为绘图处理,搭配OpenGL/ES与...

匿名
2009/06/26
23.8K
1
淺談 Google Skia 圖形處理引擎

2008 年九月,Google 宣佈以改良過的 WebKit 為核心的網路瀏覽器 Chrome,揭露了眾多新特徵,比方說嶄新的 [V8] JavaScript (ECMAscript) 執行引擎,或許因為太亮眼,掩蔽了所使用另一個開放...

红薯
2009/06/26
3.1K
0
[Android]android解决bitmap内存溢出

[转贴]最近在做一款塔防游戏,用的事surfaceview框架,由于图片过多,而且游戏过程中都需要这些图片,所以加载成bitmap后造成OOM(out of memory)异常。下面是我一步一步找解决此问题的纪录...

清水湾2012
2013/09/25
0
0
skia问题,如何编写正确。mk文件

@拉风的道长 你好,想跟你请教个问题: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) MY_LOCAL_ANDSRC:=D:\BaiduYunDownload\Android4.4 LOCAL_MODULE:=skiajni LOCAL_CPP_EXTENSION......

楚休红
2014/05/23
284
3

没有更多内容

加载失败,请刷新页面

加载更多

Linux下端口转发工具rinetd介绍

linux下简单好用的工具rinetd,实现端口映射/转发/重定向,针对TCP协议,不支持UDP。 官网地址 http://www.boutell.com/rinetd 里面介绍及使用齐全。 使用场景举例: 阿里云内网Redis连接问题...

ouhoo
9分钟前
0
0
Oracle学习日志-5(算数运算符,比较运算符和逻辑运算符)

因为有编程基础,所以对于这一章还是很好理解,只需要注意对NULL的运算。 操作的表格 算数运算符 查询商品名字和商品售价,并商品售价乘2 SELECT product_name,sale_price * 2 AS "sale_pri...

白话
22分钟前
0
0
搜索引擎(Lucene介绍、分词器详解)

Lucene介绍 Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简...

这很耳东先生
26分钟前
0
0
quartz详细介绍

quartz常用api Scheduler 调度程序交互的主要API。 Job 希望由调度程序执行的组件实现的接口。 JobDetail 用于定义作业的实例。 JobDataMap 可以包含不限量的序列化数据,在job运行的时候可以...

大笨象会跳舞吧
27分钟前
0
0
kotlin使用jackson序列化enum

默认情况下,我们序列化与反序列化enum是它的name,事实上大部分情况下我们需要序列化的是我们自定义的value,那应该怎么做呢? 这种情况下我们就需要@JsonValue与@JsonCreator data class U...

weidedong
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部