博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Skia深入分析8——Skia的GPU绘图
阅读量:5862 次
发布时间:2019-06-19

本文共 1760 字,大约阅读时间需要 5 分钟。

hot3.png

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适配,这样平台相关的代码就集中在此层级。

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

转载于:https://my.oschina.net/jxt1234and2010/blog/517733

你可能感兴趣的文章
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
Vertica的这些事<十>—— vertica中group by 和join 语句的优化
查看>>
Spark修炼之道(基础篇)——Linux大数据开发基础:第九节:Shell编程入门(一)...
查看>>
MySQL中如何启用InnoDB数据引擎
查看>>
Duplicate Symbol链接错误的原因总结和解决方法[转]
查看>>
适配器模式
查看>>
刨根问底区块链 —— 基础篇
查看>>
php 直接调用svn命令
查看>>
建立低权限的ftp帐号
查看>>
htpasswd
查看>>
Android窗口机制(三)Window和WindowManager的创建与Activity
查看>>
Android 编译出错解决
查看>>
iOS--The request was denied by service delegate (SBMainWorkspace) for reason:
查看>>
Android 打开WIFI并快速获取WIFI的信息
查看>>
Spring boot 入门篇
查看>>
【IOS开发】GDataXML解析XML
查看>>
Iptables
查看>>
我的友情链接
查看>>
Flaapy Bird项目笔记
查看>>