文档章节

Skia深入分析10——Skia库的性能与优化潜力

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 1502
阅读 28
收藏 0
点赞 0
评论 0

Skia库性能与优化潜力

图形/渲染

算法/架构

作为图形渲染引擎,性能上是非常重要的,按通常Android手机60帧的刷新率,绘制一帧的总时间只有16ms,可谓是毫厘必争。提升性能到最后,就必然跟不同CPU的特性打交道,毕竟一个SIMD下去,好做的提升5、6倍,不那么好做的也达到2、3倍,收益极其可观。
SIMD,在intel上是SSE,在arm上是neon,在mips上则是其dsp功能。使用SIMD,需要代码架构是满足内存连续性要求的,否则需要重构,Skia作为正常的图形渲染引擎,采用行渲染方式,易于实现SIMD。在充分优化的场景,其速度与GPU渲染不相上下。
总体而言,Skia库的渲染架构是遵循连续性,易于优化的。目前Skia中的高频使用函数基本上都进行了优化,并且由于软件渲染使用频率的降低,进一步优化的价值不大。但从代码层面来看覆盖率并不是特别高,遇到特定场景卡顿了,还是可以挖出几个函数优化下的。
从算法来看,Skia里面的图形绘制算法基本上都达到了最优,没有什么多余的步骤。编解码方面,存在一些多余的内存拷贝、采样缩放等。

行填充

这里面的行填充包括一行像素的透明度混合、颜色格式转换、抖动处理。在SkBlitter构建时,根据源、目标像素格式和paint属性挑选。
neon优化的相关代码见 src/opts/SkBlitRow_opts_arm_neon.cpp
主要通过 platformProc的转换而得。
大部分行填充的类型是做了neon优化的,这些也是用得很频繁的函数。

图像绘制

Sprite流程

在前面有讲述,将用来绘制的图像预先旋转缩放好,使之和目标区域一样大,并且坐标没有小数位,可以走进Sprite流程。但目前有不少限制,这些不支持的情况并不是原理不允许,而是没有做,有需要的话可以补上。
详细见
SkSpriteBlitter::ChooseD16
SkSpriteBlitter::ChooseD32

采样

前面已有说明图像采样的设计。
对于Matrix proc,在SkBitmapProcState::chooseMatrixProc函数中决定函数分支。
这些函数也是公共头文件加宏组合出来的。
neon的详见:
src/opts/SkBitmapProcState_matrixProcs_neon.cpp
src/opts/SkBitmapProcState_matrixProcs_neon.h
主要是一次计算四个坐标

对于采样的
src/opts/SkBitmapProcState_filter_neon.h
它与
src/core/SkBitmapProcState_procs.h
构成函数。
这个功能是只是做一个像素的双线性插值计算(计算过程向量化实现)。感觉优化力度并不够。

在仅缩放的插值情况,由于一行的像素是相邻的,插值计算以行为单位处理会比较效率。

高级插值似乎是没有做优化,用得也少,这个还是靠GPU优化好些。

文本绘制

文本绘制中,Skia很关键的优化方法是建立了字形Mask缓存机制,blitMask过程和blitRect的过程相似,也是用的加速过的行渲染函数。这样在绘制文字固定时只是第一次解析字体构建缓存慢。
不过在生成字体Mask缓存的流程中,generateImage函数并没有充分优化。
Mask需要占用一定量的内存,Skia中可以设置其上限(默认8M),这个是每个应用都占这么多,整个系统加起来其实就很大了。应用如果经常变字形,改效果,这个内存很快就会到上限,然后就经常找不到cache从而性能下降。
在一些情况下无法建Mask缓存,只能存路径SkPath,这时的性能也会差一些。

路径绘制

路径绘制里计算边界的过程基本上没有什么好方法优化,填充时也是利用行渲染函数和采样算法。

图像/算法

编解码

解码速度在系统中还是比较重要的,关系到应用开启的速度。
Google对其优化主要在对应的编解码库中实现,Skia里面只是配置参数。
而Skia本身的一些处理如颜色转换、下采样等可能被认为相对解码本身而言较短,并没有做优化。但做一下估计还可以提升5%左右。
制作SOC的厂商可能会修改这一部分代码,使之用特定DSP等硬件实现。不过考虑到硬件编解码的一些限制,还是会有不少场景不得不回归软件编解码。
区域解码基本上是用硬件优化不了或优化不好的,如果内存足够,使用硬解码后原理上也不需要区域解码这种方式提高速度。

特效

特效主要是SkMask,里面有高斯模糊、光照效果等的实现。
其优化的代码也在 src/opts/目录下。
在CPU上做这种代码的优化,需要把浮点转成近似整数,会有一定的精度误差。还是走GPU加速的方案好些。

GPU

Skia-GPU在当前的方式下,需要将绘制结果拷贝出来,因而不好用做渲染。
但如果修改一下,允许外界输入 EGL-Image来创建SkSurface,映射为输出的纹理和FBO,便可以将这次拷贝避免。不过,不走窗口系统,仅仅只是输出到一个纹理是否会对GPU性能有影响,很难说。
Skia-GPU流程的缓存的管理感觉不如硬件加速引擎hwui那一套好。

BenchMark

Skia目录下面有个 bench文件夹,里面是测试各项性能的代码。

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

© 著作权归作者所有

共有 人打赏支持
jxt1234
粉丝 4
博文 36
码字总数 41634
作品 0
杭州
Android 中图片压缩分析(上)

作者: shawnzhao,QQ音乐技术团队 一员 一、前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩。 前者是在不改变图片尺寸的情...

腾讯云社区
2017/11/13
0
0
Android源码中的skia库里的bench怎么使用?

在Android源码的SKia库中有bench可以测SKia库的性能,但是我作为新手,对它的使用不是很清楚,还请大神能够解答,谢谢。

wyqwh
2014/12/30
172
0
Chrome 4.0正式发布,性能提升42%

继1月21日对Chrome 4.0 Beta进行最后一次升级后,Google于今天正式发布了Chrome 4.0稳定版,并将其版本号同样命名为4.0.249.78。Google Chrome项目主管Anthony Laforge在官方博客中表示,该版...

红薯
2010/01/26
1K
2
Google 图形处理引擎--Skia

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

匿名
2009/06/26
23.8K
1
Skia构建系统与编译脚本分析

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

foruok
2016/02/19
0
0
Skia图片解码模块流程分析

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

foruok
2016/02/22
0
0
skia问题,如何编写正确。mk文件

@拉风的道长 你好,想跟你请教个问题: LOCALPATH := $(call my-dir) include $(CLEARVARS) MYLOCALANDSRC:=D:BaiduYunDownloadAndroid4.4 LOCALMODULE:=skiajni LOCALCPPEXTENSION:=.cpp LO......

楚休红
2014/05/23
263
3
Chrome 即将被整合进 Android 中

Conceivably Tech的消息已得到证实,Google Chrome即将被整合进Android中。一篇在Chromium Message Boards上发表的文章告诉我们Android版的Chrome将有着与台式机版本一样的功能——标签页,S...

小卒过河
2011/10/17
2.3K
8
Android Graphic : apk and Skia/OpenGL|ES

Android apk里面的画图分为2D和3D两种:2D是由 Skia 来实现的,也就是我们在框架图上看到的SGL,SGL也会调用部分opengl的内容来实现简单的3D效果;3D部分是由OpenGL|ES实现的,OpenGL|ES是O...

Jerikc
2014/05/27
0
0
有人把Skia编译到iOS上面去嘛?

最近在用skia写一个引擎库,但是发现skia没有办法编译到iOS上面? google搜索到那些gyp的方法,好像在最新版的skia上面都失效了。有没有人知道这个如何编译啊??

撸红薯
2017/03/03
99
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JEESZ分布式框架--单点登录集成方案

JEESZ分布式框架单点登录集成方案 第一节:单点登录简介 第一步:了解单点登录 SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口. SSO的体系中有下面三种角色: 1) Us...

明理萝
3分钟前
0
1
【易错】一级缓存、二级缓存介绍与常见问题(四)

一般来说,可以在5个方面进行缓存的设计: 1.最底层可以配置的是mysql自带的query cache, 2.mybatis的一级缓存,默认情况下都处于开启状态,只能使用自带的PerpetualCache,无法配置第三方缓...

大白来袭
7分钟前
0
0
rancher安装kubernetes

参考https://rancher.com/quick-start/ 环境: Ubuntu 16.04 Docker versions are 1.12.6, 1.13.1 or 17.03.2 1、docker安装https://docs.docker.com/install/linux/docker-ce/ubuntu/#insta......

杰仪
7分钟前
0
0
几维安全Javascript代码混淆(js加密)在线使用说明

几维安全Javascript代码混淆是一项在线加密服务,用户只需将JS文件打包成zip包,提交到加密平台,即可完成代码混淆、字符串加密、属性加密、调用转换等多项保护措施,提高攻击者分析Javascr...

工作的事
10分钟前
0
0
解决dokuwiki创建中文词条文件乱码问题

若直接创建中文词条,打开本地文件夹\dokuwiki\data\pages你会发现,中文字段显示的是URL乱码,需要改一下utf8格式,方法如下:(linux系统亲测有效) 打开 .dokuwiki\conf\local.php 添加一行...

Rhymo-Wu
12分钟前
0
0
设置圆角长条progressbar背景色

1、首先在Drawable下面新建一个xml文件,将这段代码复制进去 <?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-......

王先森oO
12分钟前
0
0
Java语言学习(九):异常处理

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。常见的三种异常类型有: 检查性异常,如打开一个不存在的文件 运行时异常,如数组越界 错误,如栈溢出 ...

海岸线的曙光
16分钟前
0
0
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
16分钟前
0
0
img与background-image之间的区别

1.img <img src="图片来源" alt="图片无法显示时显示图片说明性文字" style="设置样式属性" /> img标签虽然不是块状元素,但是可以设置宽高,占位, img设置width后height会自适应匹配,如果...

爱喝水的小熊
18分钟前
0
0
Swift - 添加提示音

func createSound() { //建立的SystemSoundID对象 var soundID:SystemSoundID = 123 //获取声音地址 let path = Bundle.main.path(forResource: "3quan......

west_zll
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部