//开启
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View
目前在视图级别无法启用硬件加速

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 关闭

确定是否经过硬件加速
如果 View 已附加到硬件加速窗口,则 **View.isHardwareAccelerated() **会返回 true。
如果 Canvas 经过硬件加速,则**Canvas.isHardwareAccelerated() **会返回 true
不受支持的绘制操作
绘制模型(原理)
软件绘制:使用CPU绘制到Bitmap,然后把Bitmap渲染到屏幕
硬件绘制:CPU把绘制内容转换成GPU操作,由GPU负责真正的绘制
在硬件加速关闭的时候:

Canvas绘制的工作方式是:把要绘制的内容写进一个 Bitmap,在之后的渲染过程中,这个 Bitmap的像素内容被直接渲染到屏幕。 这种绘制方式的主要计算工作在于把绘制操作转换为像素的过程,这个过程的计算是由 **CPU **来完成的。大致就像这样:

在硬件加速开启时:

Canvas的工作方式改变了:CPU只是把绘制的内容转换为GPU 的操作保存了下来,然后就把它交给 GPU,最终由 GPU 来完成实际的显示工作。大致是这样:

硬件加速更快的原因:

GPU分摊了工作,并且GPU计算效率更快
绘制机制的改变,导致界面内容改变时的刷新效率极大提高。 (invalidate()时,其父View到顶层View不再都刷新)
硬件加速缺点:

兼容性问题 由于使用GPU(暂时)无法完成某些绘制,因此对于一些特定的API,需要关闭硬件加速,转回到使用CPU进行绘制

自定义绘制时,参看api兼容性
所有的原生自带控件,都没有用到 API 版本不兼容的绘制操作,可以放心使用
离屏缓冲
从 Android 3.0(API 级别 11)开始,可以通过 View.setLayerType()方法更好地控制如何及何时使用层。视图可以使用以下三种层类型之一:

LAYER_TYPE_NONE:视图正常渲染,不受屏幕外缓冲区支持。这是默认行为。
LAYER_TYPE_HARDWARE:如果应用经过硬件加速,视图在硬件中渲染为硬件纹理。如果应用未经过硬件加速,此层类型的行为方式与 LAYER_TYPE_SOFTWARE 相同。
LAYER_TYPE_SOFTWARE:使用软件来渲染视图,绘制到Bitmap。并顺便关闭硬件加速
所谓 View Layer,又称为离屏缓冲(Off-screen Buffer),它的作用是单独启用一块地方来绘制这个 View ,而不是使用软件绘制的 Bitmap 或者通过硬件加速的 GPU。

这块「地方」可能是一块单独的 Bitmap,也可能是一块 OpenGL 的纹理(texture,OpenGL 的纹理可以简单理解为图像的意思),具体取决于硬件加速是否开启。采用什么来绘制 View 不是关键,关键在于当设置了 View Layer 的时候,它的绘制会被缓存下来,而且缓存的是最终的绘制结果,而不是像硬件加速那样只是把 GPU 的操作保存下来再交给 GPU 去计算。通过这样更进一步的缓存方式,View 的重绘效率进一步提高了:只要绘制的内容没有变,那么不论是 CPU 绘制还是 GPU 绘制,它们都不用重新计算,而只要只用之前缓存的绘制结果就可以了。

基于这样的原理,在进行移动、旋转等**无需调用 invalidate()**的属性动画的时候,开启 Hardware Layer 将会极大地提升动画的效率,因为在动画过程中 View 本身并没有发生改变,只是它的位置或角度改变了,而这种改变是可以由 GPU 通过简单计算就完成的,并不需要重绘整个 View。所以在这种动画的过程中开启 Hardware Layer,可以让本来就依靠硬件加速而变流畅了的动画变得更加流畅。

注意:只有在对 translationX 、translationY、 rotation、 alpha 等无需调用 invalidate() 的属性做动画的时候,这种方法才适用。因为这种方法本身利用的就是当界面不发生时,缓存未更新所带来的时间的节省。所以简单地说 这种方式不适用于基于自定义属性绘制的动画。

总结:

setLayerType(LAYER_TYPE_SOFTWARE), “顺带”关闭硬件加速
关键点:translationX、 translationY 、rotation 、alpha 等无需调用 invalidate() 的属性做动画时,才适用
不适用于基于自定义属性绘制的动画
使用
view.setLayerType
// 开启离屏缓存(软件渲染位图,并关闭硬件加速)
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 开启离屏缓存(硬件渲染位图,此时不一定正在硬件加速奥)
myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

//硬件层会占用内存,因此仅在动画播放期间启用,然后在动画结束后停用
ObjectAnimator animator = ObjectAnimator.ofFloat(view, “rotationY”, 180);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setLayerType(View.LAYER_TYPE_NONE, null);// 关闭缓存
}
});
animator.start();

// withLayer() 可以自动完成上面这段代码的复杂操作
view.animate()
.rotationY(90)
.withLayer();

class RoundRectCoverView(context: Context, attrs: AttributeSet) : View(context, attrs) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val porterDuffXfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)

init {
//开启View级别的离屏缓冲,并关闭硬件加速,使用软件绘制
setLayerType(LAYER_TYPE_SOFTWARE, null)
}

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

override fun onDraw(canvas: Canvas) {
canvas.drawRoundRect(mPadding, mPadding, width - mPadding,
height - mPadding, mRoundCorner, mRoundCorner, paint)
paint.color = mCoverColor
paint.xfermode = porterDuffXfermode
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
paint.xfermode = null
}

canvas.saveLayer
override fun onDraw(canvas: Canvas) {
//Canvas的离屏缓冲
val count = canvas.saveLayer(bounds, paint)
canvas.withSave {
canvas.drawColor(mCoverColor)
canvas.clipPath(clipPath)
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.SRC)
}
//把离屏缓冲的内容,绘制到View上去
canvas.restoreToCount(count)
}

对比:

setLayerType: 把整个View都绘制在离屏缓冲中
saveLayer:把部分View内容绘制在离屏缓冲中(优先使用该方式)
硬件加速与离屏渲染的关系
硬件加速和离屏渲染分别是两个概念,只是有关系而已

硬件加速:把 View 中绘制的计算工作交给 GPU 来处理,并显示出来
离屏渲染:有没有开启硬件加速,都会单独启用一块地方来绘制 View
LAYER_TYPE_SOFTWARE:使用软件来渲染视图,绘制到Bitmap。并顺便关闭硬件加速
LAYER_TYPE_HARDWARE:
如果应用经过硬件加速,视图在硬件中渲染为硬件纹理。
如果应用未经过硬件加速,此层类型的行为方式与 LAYER_TYPE_SOFTWARE 相同。
FTWARE:使用软件来渲染视图,绘制到Bitmap。并顺便关闭硬件加速
LAYER_TYPE_HARDWARE:
如果应用经过硬件加速,视图在硬件中渲染为硬件纹理。
如果应用未经过硬件加速,此层类型的行为方式与 LAYER_TYPE_SOFTWARE 相同。

原文链接:https://blog.csdn.net/flunsna/article/details/121980553

View系列:硬件加速,从理论到实践相关推荐

  1. android 自定义view 硬件加速,Android自定义View(八) -- 硬件加速

    Android自定义View(八) – 硬件加速 今天学习自定义View部分的最有一篇:硬件加速因为无法录制GIF,所以本篇内容基本为原博 本文计划根据HenCoder系列文章进行学习,所以代码风格及 ...

  2. # HenCoder Android 自定义 View 1-8 硬件加速

    硬件加速这个词每当被提及,很多人都会感兴趣.这个词给大部分人的概念大致有两个:快速.不稳定.对很多人来说,硬件加速似乎是一个只可远观而不可亵玩的高端科技:是,我听说它很牛逼,但我不敢「乱」用,因为我怕 ...

  3. android view关闭硬件加速,Android硬件加速4种方法

    Android中,可以四给不同层次上开启硬件加速: 1.应用: 2.Activity 3.Window getWindow().setFlags(WindowManager.LayoutParams. ...

  4. “Android 硬件加速与 View Layer ”知识点笔记

    阅读文章:HenCoder Android 自定义 View 1-8 硬件加速 辅助参考文章: 1.Display List构建过程分析 2.Android硬件加速原理与实现简介 3.关于硬件加速的那 ...

  5. Android 4.0的图形硬件加速及绘制技巧

    [51CTO独家特稿]从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GPU的View在Canvas上进行画的操作时都会使用硬件加速.在最新的Andro ...

  6. Android 系统(66)---Android硬件加速相关问题总结

    Android硬件加速相关问题总结 从Android 3.0开始就支持硬件加速,充分利用GPU的特性,使得绘制View的时候更加平滑.例如在ListView(GridView)或者WebView中使用 ...

  7. android关闭硬件动画加速器,Android中的硬件加速

    从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速.硬件加速使用GPU进行View上的绘制操作. 硬件加速可以在一下四个级别开启或关闭: Application Acti ...

  8. android硬件加速 setLayerType

    从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速.硬件加速使用GPU进行View上的绘制操作. 硬件加速可以在一下四个级别开启或关闭: Application Acti ...

  9. 关于android 手机硬件加速问题

    关于安卓手机的硬件加速问题 分类: Android基础  2012-04-12 14:44  740人阅读  评论(0)  收藏  举报 最近听同事讨论硬件加速问题,完全不懂.于是乎,百度了下,原来从 ...

  10. android开发 硬件加速,Android 开发之硬件加速

    (1)定义 所谓硬件加速,指的是把某些计算工作交给专门的硬件来做,而不是和普通的计算工作一样交给 CPU 来处理.这样不仅减轻了 CPU 的压力,而且由于有了专门硬件的处理,这份计算工作的速度也被加快 ...

最新文章

  1. 在VS下用C语言连接SQLServer2008
  2. javaScript常用知识点有哪些
  3. This version of CLI is only compatible with Angular versions
  4. 九、深入Java字符串(上篇)
  5. vue2使用axios post跳坑,封装成模块
  6. css正則匹配、模糊匹配
  7. 怎么汇报一周开发工作情况_如何在没有经验的情况下获得第一份开发人员工作
  8. JS 计算日期天数差
  9. ASP.NET判断当前日期是第几周
  10. String被设计成不可变和不能被继承的原因
  11. 神经网络激活函数与损失函数
  12. Oracle Share Pool工作原理
  13. 编译安装vlmcsd
  14. endnote修改正文中参考文献标注_Endnote之文献标注
  15. 前端javascript总结笔记(一)--js的三座大山
  16. android 11.0 12.0Launcher3禁止拖动图标到Hotseat
  17. 调试lan8720a遇到的奇葩问题,自动协商永远10M。
  18. linux 内存溢出排查_linux下valgrind内存问题排查
  19. Python 括号问题
  20. 【归档】证明V的三个子空间的并是V的子空间,当且仅当其中一个子空间包含另外两个子空间

热门文章

  1. Java基础之---- 集合(一)List
  2. 2k2实用球员_NBA2KOL2:五个位置中的实用类型球员,理查德森是新一代神器
  3. 解决MYSQL不报错误详细信息的问题 Can't find error-message file
  4. JDBC学习心得(一)
  5. nutz简单登陆注解@Ok(json)在IE浏览器下报文件下载的问题
  6. 移动硬盘异常拔出后,mac上无法识别的问题
  7. vue中使用百度编辑器Ueditor
  8. opencv级联增强分类器训练流程--python实现
  9. 照度与感光度(Lux)
  10. 宏基因组单样品vamb分箱,gtdb物种注释与建树