文档章节

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

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 1502
阅读 33
收藏 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
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
私信 提问
Android 中图片压缩分析(上)

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

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

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

wyqwh
2014/12/30
198
0
Google 图形处理引擎--Skia

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

匿名
2009/06/26
23.8K
1
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
有人把Skia编译到iOS上面去嘛?

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

撸红薯
2017/03/03
191
0

没有更多内容

加载失败,请刷新页面

加载更多

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
39分钟前
1
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
57分钟前
14
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
58分钟前
1
0
Confluence 6 文档主题合并问答

在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用。我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将这个主题...

honeymose
今天
2
0
java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部