文档章节

Skia深入分析8——Skia的GPU绘图

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 691
阅读 72
收藏 0

Skia的GPU绘图

一、Skia-GPU概述

在Android4.2到Android5.0的过程中,skia中开发较频繁的部分莫过于GPU加速部分和延迟渲染机制,尽管目前来看几乎没有用到,但后续很可能会在Frameworks层引入。
在Android上面,只可能使用OpenGL,因此作为使用OpenGL的绘图引擎,关注如下要点即可:
1、OpenGL上下文如何建立(关系到如何显示绘制结果)
2、顶点如何生成
3、着色器如何管理,特效怎么设置
4、纹理、vbo、字体cache等缓存管理机制
由于OpenGL编程本身很复杂,东西也很多,这里只是介绍一下用法和流程框架,有兴趣研究的可按上述问题细看。

二、用法

/*获取OpenGL上下文*/
GrContextFactory contextFactory;
GrContext* context = contextFactory.get(GrContextFactory::kNative_GLContextType);
/*创建指定大小格式Surface,并由Surface中取出Canvas*/
const SkImageInfo info = SkImageInfo::MakeN32Premul(720,1080);
SkSurface* surface = SkSurface::NewRenderTarget(context, info);//实际上是创建一个纹理,并创建相应的fbo与之绑定,以作为渲染目标
//或者用 NewScratchRenderTarget,这个会用缓存过的目标纹理
SkCanvas* canvas = surface->getCanvas();
/*执行绘制*/
/*canvas->drawColor(0x0);*/
/*..........*/
/*..........*/
/*..........*/
/*绘制完成,取出像素*/
SkBitmap output;
output.setInfo(info);
canvas->readPixels(&output);
/*又或者读到GraphicBuffer上*/
/*输入 ANativeWindow_Buffer outBuffer*/
canvas->readPixels(info, outputBuffer.bits, outputBuffer.stride*4/*ARGB*/, 0, 0);

Skia创建GPU上下文时,其Surface并不关联Android里面的显示系统,因此是无法直接渲染上屏的,在绘制完成之后需要额外的一次readPixels,也即内存拷贝,这使其不适合做实时渲染。只是在做比较复杂的效果,如Bicubic插值、光照、模糊时,可以用一用。
关于 Skia的特效,可以看 include/effects 和 src/effects 目录下面的代码,这里面是CPU方式实现的。由于很少见用到,之前并没有介绍。
对应的gpu特效实现见 include/gpu 和 src/gpu/effects目录下的代码。

三、流程与框架

SkGpu的一次绘制基本流程如下:

Created with Raphaël 2.1.2 SkCanvas SkGpuDevice GrContext GrDrawTarget GrGpu GrGLInterface

SkCanvas:如之前章节所述,下发命令,保留Layer
SkGpuDevice:处理退化情况,将SkPaint转化为GrPaint
GrContext:构建形(顶点Vertex)且处理抗锯齿,描述色(GrDrawState)
GrDrawTarget:描述绘图目标,起接口作用,将材料打包为Drawinfo,由子类执行 onDraw方法。
GrGpu:设定Shader、设定顶点,调用OpenGL接口渲染
GrGLInterFace:由于各个厂商支持的OpenGL标准版本有所不同,且一些厂商会增加一些接口,这一层做一个API适配,这样平台相关的代码就集中在此层级。

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

© 著作权归作者所有

共有 人打赏支持
jxt1234
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
Skia图片解码模块流程分析

我在在PPAPI插件中使用Skia绘图中说可以在PPAPI插件内使用Skia来绘图。这里面会有一个与色彩空间(像素格式)相关的问题。在那篇文章里我们在PPAPI中使用PPBImageData创建2D图像缓冲区时使用...

foruok
2016/02/22
0
0
Chromium与CEF的多进程模型及相关参数

CEF基于Chromium,也是多进程模型。关于进程模型,参考这里:https://www.chromium.org/developers/design-documents/process-models。我还看到一篇韩国人写的renderer process的文章,也很不...

foruok
2016/02/02
0
0
Skia构建系统与编译脚本分析

分析下Skia的构建系统,具体编译过程参看Windows下从源码编译Skia。这里以ninja为例来分析。执行下面三条命令就可以完成编译: “python bin/sync-and-gyp”会生成ninja脚本。下面来分析脚本...

foruok
2016/02/19
0
0
Skia往SkBitmap上绘图时画不出来的问题

使用SkBitmap作为SkCanvas后端绘图时画不出来的问题 用默认条件在采用了Intel Pentium CPU的PC上编译Skia(参见Windows下从源码编译Skia)后,采用SkBitmap作为SkCanvas的后端来绘图时,遇到...

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

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

匿名
2009/06/26
23.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

活动推荐|互联网3.0与区块链新时代论坛(北京)

1 时间地点 **时间:**9月22日 14:00 - 18:00 地点:(北京海淀)西大街70号 3w咖啡 二层 2 活动详情 Harmony创始人Stephen及团队将介绍他们的区块链分片扩容技术。Stephen曾任Apple地图服务...

HiBlock
40分钟前
1
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
50分钟前
1
0
spring cloud学习笔记

工具 eclipse 4.9 gradle 4.10.2 spring cloud Finchley.SR1 spring boot 2.0.4 build.gradle buildscript {ext {springBootVersion = '2.0.4.RELEASE'}repositories {jcenter()......

bobby2006
51分钟前
1
0
Tcl命令操作实验-----(5)

Vivado% proc myproc {arg} {puts $arg}Vivado% myproc mynamemynameVivado% if {2>1} {puts 2>1} else {puts 2<1}2>1...

whoisliang
今天
1
0
比特币钱包RPC的PHP调用方法

当我们希望在Php开发的网站中加入比特币支付功能时,需要解决的第一个 问题,就是如何在Php程序代码中调用比特币钱包的RPC API开发接口来实现 我们期望的功能,例如比特币的支付与接收。 例如...

汇智网教程
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部