之前讨论过skia codec部分在o,p上的变化,比如增加了heif解码等。
其实skia在android o,p的变化不只这些。

印象最深刻的还是渲染部分

从o开始hwui渲染支持skia opengl,原来hwui只支持opengl渲染,只不过在o里,skia opengl是可选的方式,默认还是opengl,但在p上已经默认采用skia opengl了,而且去掉了选择。

Android o上的选项

Android O上相关的代码

/*** Defines the rendering pipeline to be used by the ThreadedRenderer.** Possible values:* "opengl", will use the existing OpenGL renderer* "skiagl", will use Skia's OpenGL renderer* "skiavk", will use Skia's Vulkan renderer** @hide*/
public static final String DEBUG_RENDERER_PROPERTY = "debug.hwui.renderer";

上边定义了可选的几个选项,是不是看到了vulkan,看来android早有打算

Readback& RenderThread::readback() {
if (!mReadback) {auto renderType = Properties::getRenderPipelineType();switch (renderType) {case RenderPipelineType::OpenGL:mReadback = new OpenGLReadbackImpl(*this);break;case RenderPipelineType::SkiaGL:case RenderPipelineType::SkiaVulkan:// It works to use the OpenGL pipeline for Vulkan but this is not// ideal as it causes us to create an OpenGL context in addition// to the Vulkan one.mReadback = new skiapipeline::SkiaOpenGLReadback(*this);break;default:LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t) renderType);break;}
}
return *mReadback;

}
同样看到了vulkan,以及相关代码,但是并没有启动,应该还没有实现好

Android P上的代码

Readback& RenderThread::readback() {
if (!mReadback) {auto renderType = Properties::getRenderPipelineType();switch (renderType) {case RenderPipelineType::OpenGL:mReadback = new OpenGLReadbackImpl(*this);break;case RenderPipelineType::SkiaGL:mReadback = new skiapipeline::SkiaOpenGLReadback(*this);break;case RenderPipelineType::SkiaVulkan:mReadback = new skiapipeline::SkiaVulkanReadback(*this);break;default:LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);break;}
}
return *mReadback;

}
看上去p上hwui已经开始支持vulkan了

class SkiaVulkanReadback : public Readback {
public:
SkiaVulkanReadback(renderthread::RenderThread& thread) : Readback(thread) {}
virtual CopyResult copySurfaceInto(Surface& surface, const Rect& srcRect,SkBitmap* bitmap) override {//TODO: implement Vulkan readback.return CopyResult::UnknownError;
}
virtual CopyResult copyGraphicBufferInto(GraphicBuffer* graphicBuffer,SkBitmap* bitmap) override {//TODO: implement Vulkan readback.return CopyResult::UnknownError;
}

但看代码实际上还是未启用状态可能有很多问题还没解决

RenderPipelineType Properties::getRenderPipelineType() {
if (sRenderPipelineType != RenderPipelineType::NotInitialized) {return sRenderPipelineType;
}
char prop[PROPERTY_VALUE_MAX];
property_get(PROPERTY_RENDERER, prop, "skiagl");
if (!strcmp(prop, "skiagl")) {ALOGD("Skia GL Pipeline");sRenderPipelineType = RenderPipelineType::SkiaGL;
} else if (!strcmp(prop, "skiavk")) {ALOGD("Skia Vulkan Pipeline");sRenderPipelineType = RenderPipelineType::SkiaVulkan;
} else {  //"opengl"ALOGD("HWUI GL Pipeline");sRenderPipelineType = RenderPipelineType::OpenGL;
}
return sRenderPipelineType;

Android p上默认已经是skiagl了,而且skiavk已经ready或者至少可以work了

效率问题

skia opengl会比opengl快吗?

网上很多人都表示skia opengl比opengl快,但是从实现的角度上讲核心没有不同,不同的可能是模块代码结构流程,并没有实质的提升,更不会出现能从使用者的角度观察到变化。因此做了一个实验,在60fps的一个场景下对opengl和skia opengl的gl绘制耗时做了一个对比。
OpenGL

OpenGL skia

draw: display list绘制信息
prepare: 同步时间
Process: gl绘制时间
Execute: swapbuffer时间

从上边的数据可以看到两种方式process的时间基本没有差别,而且整体渲染的时间也不相上下。所以从实验角度也不存在谁比谁更快。
而且两个cpu使用情况也基本相同。没什么差别。

真正的提升应该是在vulkan实现之后

arm官方和提供了一些测试数据表明无论从性能还是功耗上都比opengl es有很大提升。如下链接有些可能需要翻墙。
https://community.arm.com/gra...
https://www.youtube.com/watch...

这是官方的数据,有必要去了解下android vulkan以及skia vulkan。

  • Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL

    • or Vulkan.

*/
//#define PROPERTY_RENDERER “debug.hwui.renderer"
在android p上可以通过设置上边的属性为skiavk来指定vulkan,但是在o上不要这么做,因为在o上vulkan还没有真正实现,会有很多问题比如应用打不开等等。
下边是在android p上同一场景的一组数据对比,看数据总体上skia vulkan比skia opengl有很比较大的提升,但是又一些很大的凸起,不太稳定,没有skia opengl平稳,可能还没优化好,也许要等到adnroid 9.2或者android Q才能正式发布。
skia OpenGL

skia vulkan

android 2DUI的渲染发展大概是这么一个进化过程

Android早期通过skia库进行2d渲染,后来加入了hwui利用opengl替换skia进行大部分渲染工作,现在开始用skia opengl替换掉之前的opengl,从p的代码结构上也可以看出,p开始skia库不再作为一个单独的动态库so,而是静态库a编译到hwui的动态库里,将skia整合进hwui,hwui调用skia opengl,也为以后hwui使用skia vulkan做铺垫。

hwui opengl VS skia opengl VS skia vulkan?相关推荐

  1. 【OpenGL】Android 中的 skia 和 OpenGL ES

    Android Graphic : apk and Skia/OpenGL|ES Android apk 里面的画图分为2D和3D两种:2D是由Skia 来实现的,也就是我们在框架图上看到的SGL,S ...

  2. Skia的初探(Skia的GN脚本编译与第一个Skia应用)

    前言 如今大前端代表之一flutter十分火热,也是一种大的趋势.flutter与rn对大前端上的理解不同,rn是自上而下的大前端解决方案,而flutter是自下而上的大前端解决方案.为什么我说flu ...

  3. 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

    文章目录 一.OpenGL 状态机概念 二.OpenGL 矩阵概念 上一篇博客 [OpenGL]八.初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗 ...

  4. OpenGL版本与OpenGL扩展机制

    1 opengl的版本区别(在opengl官方文档中有详细说明)     针对Opengl不同版本的升级是主要是扩展指令集.     现在版本是4.0啦 1.1 opengl1.1 1995年,SGI ...

  5. [OpenGL ES 02]OpenGL ES渲染管线与着色器

    http://blog.csdn.net/kesalin/article/details/8223649 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循"署名 ...

  6. 【OpenGL】使用OpenGL的GLU库绘制BSpline曲线

    [OpenGL]使用OpenGL的GLU库绘制BSpline曲线. 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 使用OpenGL的GLU库绘制BSpline曲线. 2.核心代码 /// T ...

  7. android opengl版本,Android OpenGL ES(一)开发入门

    早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧.今天开始通过实践+博文方式学习掌握 OpenGL.此文对于 OpenGL 的学习分为以下部分: OpenGL 基础概念 OpenGL 坐 ...

  8. 【OpenGL ES】OpenGL ES简介

    [参考-khronos]https://www.khronos.org/opengles/ 1.简介 OpenGL ES(OpenGL for Embeded System)是OpenGL(Open ...

  9. 【Android OpenGL开发】OpenGL ES与EGL介绍

    什么是OpenGL ES OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的编程图形程序接口,主要用于图像的渲染. Android提供了简化版的OpenGL接口,即O ...

最新文章

  1. [html] html页面中如何实现gif图片重新播放?
  2. 不能干一辈子开发???
  3. Oracle char varchar varchar2 nvarchar2 的区别
  4. Python程序执行顺序
  5. java开启一个线程_【jdk源码分析】java多线程开启的三种方式
  6. Splash args 属性
  7. (译)SDL.NET Surfaces 相关介绍
  8. linux连接交换机软件,如何用超级终端连接交换机 - 全文
  9. SIPP对接fs压力测试
  10. 基于机智云的智能花盆1.0
  11. 分享:实时语音通讯,可广域网实时通讯,音质清晰流畅!
  12. (12)树莓派B+ GPIO控制四驱车
  13. css图片渐变透明效果
  14. SercureCRT使用
  15. android开发——分秒计时器(可 开始/暂停/继续/停止)
  16. h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数
  17. 微信小程序项目实例——食堂吃哪个
  18. 淘宝新手如何做推广 最新最全的淘宝店铺免费推广方法秘诀
  19. mysql怎么打开slow_MySQL开启Slow慢查询的方法示例
  20. Java JMF 多媒体框架

热门文章

  1. 关于问题PageNotFound.noHandlerFound No mapping found for HTTP的解决
  2. 专访谷歌医疗AI LilyPeng:吴恩达的医生“失业论”不妥
  3. 外星人到底在哪?普利茅斯大学新建AI寻系外生命系统
  4. 零基础入门神经网络:从原理、主要类型到行业应用
  5. React 高级应用 -- 错误边界 Error Boundaries
  6. 特斯拉进入Autopilot 2.0时代,高举“普通雷达”旗帜!
  7. 【DP】【单调队列】【NOI2005】瑰丽华尔兹
  8. 激活Maven profile的几种方式
  9. 利用第三方工具上传文件
  10. PAT1021 Deepest Root