渲染性能

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的时间以及内存的浪费。不过现在的图片加载库基本都实现了合适的尺寸加载位图的功能。

自定义控件被忽略的渲染性能相关推荐

  1. 如何更快地渲染?深入了解3D渲染性能的指南!(5)

    上文<如何更快地渲染?深入了解3D渲染性能的指南!(4)>我们介绍了从场景内部灯光.用料.反射.材质等方面的优化,提升场景渲染的速度.本文Renderbus云渲染农场将继续从渲染设置.全局 ...

  2. 携程RN渲染性能优化实践

    一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指标是FMP与TTI,在 React Native 以跨平台前端框架身份逐 ...

  3. 干货 | 携程RN渲染性能优化实践

    作者简介 佳璐,前端开发专家,关注前端框架.性能.质量.效率和新技术. 一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指 ...

  4. 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下

    博客 有更多精品文章哟. Composite 的优化 终于,我们到了像素管道的末尾.对于这一部分的优化策略,我们可以从为什么需要 Composited Layer(Graphics Layer)来入手 ...

  5. 深入分析 Flutter 渲染性能

    简介: Flutter 有很多优点,特别是对于开发者来说,跨平台多端支持,丰富的 UI 组件库和交互效果,声明式 UI,React 的更新方式,Hot-reload 提高开发效率等等.虽然它在渲染性能 ...

  6. 深度剖析浏览器渲染性能原理,你到底知道多少?

    深度剖析浏览器渲染性能原理,你到底知道多少? 渲染卡顿是怎么回事? 网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑的动画等. 大多数设备的刷新频率是60次/秒,也就说是浏览 ...

  7. SRP Batcher:提升您的渲染性能

    简介 在2018年,Unity引入了一种高可定制的渲染技术,称之为Scriptable Render Pipeline(SRP). 其中一部分是一个名为SRP Batcher的新底层渲染路径,它可以在 ...

  8. 渲染性能优化之Culling 剔除

    几种剔除: 背面裁剪(Backface Culling) 视锥裁剪(View Frustum Culling) 遮挡剔除(Occlusion Culling) 层次视锥裁剪(Hierarchical ...

  9. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...

  10. 使用 content-visibility 优化渲染性能

    最近在业务中实际使用 content-visibility 进了一些渲染性能的优化. 这是一个比较新且有强大功能的属性.本文将带领大家深入理解一番. 何为 content-visibility? co ...

最新文章

  1. python逐行读取txt写入新的txt_Python逐行读取txt文本,按符合分割词并逐行写入txt...
  2. 取地址符和解引用符的区别_(&)和解引用(*)运算符的地址以及C中的指针...
  3. C# JsonHelper类
  4. ae制h5文字动画_AE文字拉伸动画如何制作
  5. 排序算法部分知识点小结
  6. 第二阶段冲刺——个人总结07
  7. raft算法_MIT 6.824 分布式系统 | Lab 2A:Raft选举
  8. 整合hibernate4到spring4mvc框架
  9. android 自定义adjustnothing,Android应用开发之自定义控件:Flag标签
  10. 不用找,你想要的家具贴图素材都在这里
  11. 复制iPhone端百度网盘下载好的视频到电脑(Mac / Windows)- iOS 12.4
  12. 双层pdf怎么制作(可以复制里面文字)纸质书如何制作扫描图片书签目录?
  13. pano2vr导出html看不,【答疑】pano2vr6导出的全景,是空白的,打不开,? - 视频教程线上学...
  14. 在html如何设计页面大小,网页设计中页面尺寸标准
  15. 如何设置qq说说展示时间_qq说说可以设置时间
  16. Pinbox 使用快捷键打开网页
  17. PDPS软件:机器人抓手工具运动机构制作与仿真运行测试
  18. STM32模拟读卡器,对于工控机方案谨防踩坑
  19. rk3128 通过自带buildroot打包开发板根文件系统,重做自己的img镜像
  20. 分布式计算框架Hadoop原理及架构全解

热门文章

  1. 解决C#网络通信编程的阻塞问题
  2. [Z]Java Architecture for XML Binding (JAXB)
  3. Google常用搜索技巧
  4. C++字符串可以这样用!
  5. [做一个幸福的记号 忘了琐碎的烦恼]西兰花猪柳
  6. 二维数组求最大子数组和
  7. JQuery EasyUI 之 messager基本使用
  8. 2019年3月1日-日记
  9. android getpost代码
  10. [Java][Liferay] 模拟用户