文档章节

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

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 691
阅读 59
收藏 0
点赞 0
评论 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
粉丝 4
博文 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
Android4.0 NDK下使用SkCanvas程序崩溃

@WolfCS 你好,想跟你请教个问题: 我在Android2.3下可以运行的绘图程序,是在ndk中调用skia的skcanvas来绘制图形的,在4.1.2下运行时一调用到skia的库就会异常。而且想要用4.1的android代码...

Zpetra
2013/02/26
851
3
在HTML中给PPAPI插件配置参数

foruok原创,如需转载请关注foruok的微信订阅号“程序视界”联系foruok。 在HTML中,可以通过embed或object标签来配置插件。使用embed类似下面这样: 使用object类似下面这样: PPAPI插件实例...

foruok
2016/02/05
0
0
skia方面的问题,如何让编译的动态库在多个sdk版本上都能运行?

@fjlikun 你好,想跟你请教个问题:我用android4.4的源码和skia源码编译的动态库,android.mk LOCALPATH := $(call my-dir) include $(CLEARVARS) LOCALMODULE:=Test MYLOCALLIB:=D:/360Dow......

楚休红
2014/05/28
867
1
PPAPI与Browser间使用AsyncIPC通信

采用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc),来完成PPAPI Plugin进程与Browser进程的通信。 foruok原创,如需转载请关注foruok的微信订阅号“程序视界”联系foruok。 Asyn...

foruok
2016/02/05
0
0
Skia引擎API整理介绍(skia in Android 2.3 trunk)

序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia) 也只有寥寥无几的文字简单介绍了SkCanvas, SkBitmap等几个主要的class,我...

米狗族
2011/01/26
3.9K
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
0
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部