自定义控件被忽略的渲染性能
渲染性能
Android UI的工作分两阶段:
1.在UI线程Record View#draw
2.在RenderThread线程DrawFrame(RenderThread:使用GPU资源的线程)
第一阶段随着View的invalidated在draw(Canvas)中进行
第二阶段native RenderThread基于Record View#draw步骤所产生的数据内容而进行相应的处理。
渲染性能:UI线程
如果Record View#draw占用时间长,比如在UI线程绘制bitmap。当然,这种直接在UI线程绘制bitmap的方式应该避免使用。
示例1:在主线程完成bitmap绘制,并显示圆角头像自定义控件,onDraw代码实现可能如:
Canvas bitmapCanvas = new Canvas(roundedOutputBitmap); Paint paint = new Paint(); paint.setAntiAlias(true); bitmapCanvas.drawRoundRect(0, 0,roundedOutputBitmap.getWidth(), roundedOutputBitmap.getHeight(), 30, 30, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); bitmapCanvas.drawBitmap(sourceBitmap, 0, 0, paint); bitmapCanvas.setBitmap(null); canvas.drawBitmap(roundedOutputBitmap, 0, 0, null);
如果你现在是用这种方式实现其它自定义控件bitmap的绘制,假设sourceBitmap是一个很大的位图,哪怕是缓存,加载进来会出现明显的卡顿现象,所以用后台线程完成这个工作。
示例2:.有时自定义控件需要在设置bitmap的时候,才显示bitmap,代码如下:
void setBitmap(Bitmap bitmap) {mBitmap = bitmap;invalidate(); }void onDraw(Canvas canvas) {canvas.drawBitmap(mBitmap, null); }
可以考虑用下面的代码替换:
void setBitmap(Bitmap bitmap) {mShaderPaint.setShader(new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP));invalidate(); }void onDraw(Canvas canvas) {canvas.drawRoundRect(0, 0, mWidth, mHeight, 20, 20, mShaderPaint); }
这样可以给bitmap数据源起到保护的作用,避免bitmap中间因为其他的修改(如在bitmap数据源头添加渐变效果或者颜色过滤)而导致bitmap的数据源被修改。
渲染性能:RenderThread
有些放在onDraw(canvas)中的代码套路或许很容易想到,但却会在RenderThread触发频繁的运算。
示例
canvas.save(); canvas.clipPath(mCirclePath); canvas.drawBitmap(mBitmap); canvas.restore();
clipPath(Path)会触发很多裁剪工作,应该尽量少用。可以的话,考虑用下面这种方式替换:
mPaint.setShader(new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP)); canvas.drawPath(mCirclePath, mPaint);
Android把bitmaps作为OpenGL的纹理来显示,第一次在一帧中显示bitmap时,它就会被上传到GPU上。如下图Systrace所示的Upload width x heigth Texture。虽然它只需要若干毫秒,但还是很有必要让GPU去显示图片的。
如果这个过程占用很长的时间,可以先查看width和height的值。确保显示的bitmap没有比屏幕所需要展示位图的区域还大。如果width和height的值比展示bitmap的区域还大,那么就会导致upload bitmap to GPU的时间以及内存的浪费。不过现在的图片加载库基本都实现了合适的尺寸加载位图的功能。
自定义控件被忽略的渲染性能相关推荐
- 如何更快地渲染?深入了解3D渲染性能的指南!(5)
上文<如何更快地渲染?深入了解3D渲染性能的指南!(4)>我们介绍了从场景内部灯光.用料.反射.材质等方面的优化,提升场景渲染的速度.本文Renderbus云渲染农场将继续从渲染设置.全局 ...
- 携程RN渲染性能优化实践
一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指标是FMP与TTI,在 React Native 以跨平台前端框架身份逐 ...
- 干货 | 携程RN渲染性能优化实践
作者简介 佳璐,前端开发专家,关注前端框架.性能.质量.效率和新技术. 一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指 ...
- 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下
博客 有更多精品文章哟. Composite 的优化 终于,我们到了像素管道的末尾.对于这一部分的优化策略,我们可以从为什么需要 Composited Layer(Graphics Layer)来入手 ...
- 深入分析 Flutter 渲染性能
简介: Flutter 有很多优点,特别是对于开发者来说,跨平台多端支持,丰富的 UI 组件库和交互效果,声明式 UI,React 的更新方式,Hot-reload 提高开发效率等等.虽然它在渲染性能 ...
- 深度剖析浏览器渲染性能原理,你到底知道多少?
深度剖析浏览器渲染性能原理,你到底知道多少? 渲染卡顿是怎么回事? 网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑的动画等. 大多数设备的刷新频率是60次/秒,也就说是浏览 ...
- SRP Batcher:提升您的渲染性能
简介 在2018年,Unity引入了一种高可定制的渲染技术,称之为Scriptable Render Pipeline(SRP). 其中一部分是一个名为SRP Batcher的新底层渲染路径,它可以在 ...
- 渲染性能优化之Culling 剔除
几种剔除: 背面裁剪(Backface Culling) 视锥裁剪(View Frustum Culling) 遮挡剔除(Occlusion Culling) 层次视锥裁剪(Hierarchical ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...
- 使用 content-visibility 优化渲染性能
最近在业务中实际使用 content-visibility 进了一些渲染性能的优化. 这是一个比较新且有强大功能的属性.本文将带领大家深入理解一番. 何为 content-visibility? co ...
最新文章
- python逐行读取txt写入新的txt_Python逐行读取txt文本,按符合分割词并逐行写入txt...
- 取地址符和解引用符的区别_(&)和解引用(*)运算符的地址以及C中的指针...
- C# JsonHelper类
- ae制h5文字动画_AE文字拉伸动画如何制作
- 排序算法部分知识点小结
- 第二阶段冲刺——个人总结07
- raft算法_MIT 6.824 分布式系统 | Lab 2A:Raft选举
- 整合hibernate4到spring4mvc框架
- android 自定义adjustnothing,Android应用开发之自定义控件:Flag标签
- 不用找,你想要的家具贴图素材都在这里
- 复制iPhone端百度网盘下载好的视频到电脑(Mac / Windows)- iOS 12.4
- 双层pdf怎么制作(可以复制里面文字)纸质书如何制作扫描图片书签目录?
- pano2vr导出html看不,【答疑】pano2vr6导出的全景,是空白的,打不开,? - 视频教程线上学...
- 在html如何设计页面大小,网页设计中页面尺寸标准
- 如何设置qq说说展示时间_qq说说可以设置时间
- Pinbox 使用快捷键打开网页
- PDPS软件:机器人抓手工具运动机构制作与仿真运行测试
- STM32模拟读卡器,对于工控机方案谨防踩坑
- rk3128 通过自带buildroot打包开发板根文件系统,重做自己的img镜像
- 分布式计算框架Hadoop原理及架构全解