hwui opengl VS skia opengl VS skia vulkan?
之前讨论过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?相关推荐
- 【OpenGL】Android 中的 skia 和 OpenGL ES
Android Graphic : apk and Skia/OpenGL|ES Android apk 里面的画图分为2D和3D两种:2D是由Skia 来实现的,也就是我们在框架图上看到的SGL,S ...
- Skia的初探(Skia的GN脚本编译与第一个Skia应用)
前言 如今大前端代表之一flutter十分火热,也是一种大的趋势.flutter与rn对大前端上的理解不同,rn是自上而下的大前端解决方案,而flutter是自下而上的大前端解决方案.为什么我说flu ...
- 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )
文章目录 一.OpenGL 状态机概念 二.OpenGL 矩阵概念 上一篇博客 [OpenGL]八.初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗 ...
- OpenGL版本与OpenGL扩展机制
1 opengl的版本区别(在opengl官方文档中有详细说明) 针对Opengl不同版本的升级是主要是扩展指令集. 现在版本是4.0啦 1.1 opengl1.1 1995年,SGI ...
- [OpenGL ES 02]OpenGL ES渲染管线与着色器
http://blog.csdn.net/kesalin/article/details/8223649 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循"署名 ...
- 【OpenGL】使用OpenGL的GLU库绘制BSpline曲线
[OpenGL]使用OpenGL的GLU库绘制BSpline曲线. 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 使用OpenGL的GLU库绘制BSpline曲线. 2.核心代码 /// T ...
- android opengl版本,Android OpenGL ES(一)开发入门
早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧.今天开始通过实践+博文方式学习掌握 OpenGL.此文对于 OpenGL 的学习分为以下部分: OpenGL 基础概念 OpenGL 坐 ...
- 【OpenGL ES】OpenGL ES简介
[参考-khronos]https://www.khronos.org/opengles/ 1.简介 OpenGL ES(OpenGL for Embeded System)是OpenGL(Open ...
- 【Android OpenGL开发】OpenGL ES与EGL介绍
什么是OpenGL ES OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的编程图形程序接口,主要用于图像的渲染. Android提供了简化版的OpenGL接口,即O ...
最新文章
- [html] html页面中如何实现gif图片重新播放?
- 不能干一辈子开发???
- Oracle char varchar varchar2 nvarchar2 的区别
- Python程序执行顺序
- java开启一个线程_【jdk源码分析】java多线程开启的三种方式
- Splash args 属性
- (译)SDL.NET Surfaces 相关介绍
- linux连接交换机软件,如何用超级终端连接交换机 - 全文
- SIPP对接fs压力测试
- 基于机智云的智能花盆1.0
- 分享:实时语音通讯,可广域网实时通讯,音质清晰流畅!
- (12)树莓派B+ GPIO控制四驱车
- css图片渐变透明效果
- SercureCRT使用
- android开发——分秒计时器(可 开始/暂停/继续/停止)
- h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数
- 微信小程序项目实例——食堂吃哪个
- 淘宝新手如何做推广 最新最全的淘宝店铺免费推广方法秘诀
- mysql怎么打开slow_MySQL开启Slow慢查询的方法示例
- Java JMF 多媒体框架
热门文章
- 关于问题PageNotFound.noHandlerFound No mapping found for HTTP的解决
- 专访谷歌医疗AI LilyPeng:吴恩达的医生“失业论”不妥
- 外星人到底在哪?普利茅斯大学新建AI寻系外生命系统
- 零基础入门神经网络:从原理、主要类型到行业应用
- React 高级应用 -- 错误边界 Error Boundaries
- 特斯拉进入Autopilot 2.0时代,高举“普通雷达”旗帜!
- 【DP】【单调队列】【NOI2005】瑰丽华尔兹
- 激活Maven profile的几种方式
- 利用第三方工具上传文件
- PAT1021 Deepest Root