让Android TextureView Canvas支持硬件加速

SurfaceViewTextureView是Android提供的支持异步线程渲染的控件,虽然都是异步渲染,但不论在使用方式上还是在底层实现原理上都是有差异的。

SurfaceView在内部是直接创建一个独立于当前Activity的Surface,此Surface默认处于Activity Surface的下面,然后在Activity上对应位置挖一个相应大小的透明窟窿,使下面的SurfaceView的内容能够展示出来。

TextureView 的内容是正常渲染到当前Activity的Surface上的。其内部是基于SurfaceTexture实现的,当渲染侧渲染完成后,SurfaceTexture会将渲染内容以纹理的形式上传到GPU,接着由TextureView将纹理渲染到当前Activity的视图树中。

在使用上,SurfaceViewTextureView 都提供了Canvas接口给应用侧进行异步渲染,但SurfaceView 可以由应用指定Canvas是否走硬件加速流程,而TextureView 提供的TextureView.lockCanvas()TextureView.lockCanvas(Rect dirty)接口返回的Canvas都是非硬件加速的,因此渲染指令的执行完全是由CPU执行的,虽然是异步线程,但是在渲染复杂内容时,一方面单帧渲染耗时高导致渲染帧率低,另一方面会消耗大量CPU资源,导致应用整体卡顿以及设备发热、掉电等问题。

解决方案

使用liuwons/HwTextureView

使用方式和普通TextureView 接本一致,lockCanvas()获取的Canvas在Android 28以上平台具有硬件加速能力。需要注意的是lockCanvas(Rect dirty)方法不可用(直接返回null)。

内部实现是创建了一个Surface,作为图形生产者,消费者侧连接了TextureViewSurfaceTexture,使用此Surface对外提供硬件加速接口。

渲染性能对比

测试工程: TextureViewPlayground - Github

测试设备: Google Pixel 7

绘制内容: 每一帧绘制相同的30笔不透明/半透明的stroke path 绘制结果:

统计内容:

  • 每一帧的渲染时长(只统计所有drawPath方法的执行总耗时,不包含lockCanvas和unlockCanvasAndPost方法执行耗时):
  • CPU使用率

统计结果:

TextureView HwTextureView
渲染时长 10ms 1ms
CPU 13ms 8ms

TextureView测试数据

HwTextureView测试数据

相关推荐
程序员陆业聪1 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android
hnlgzb3 小时前
常见的Android Jetpack库会有哪些?这些库中又有哪些常用类的?
android·android jetpack
钛态6 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos
王码码20356 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos
左手厨刀右手茼蒿6 小时前
Flutter for OpenHarmony: Flutter 三方库 shamsi_date 助力鸿蒙应用精准适配波斯历法(中东出海必备)
android·flutter·ui·华为·自动化·harmonyos
代码飞天7 小时前
wireshark的高级使用
android·java·wireshark
2501_915918418 小时前
苹果App Store上架审核卡住原因分析与解决方案指南
android·ios·小程序·https·uni-app·iphone·webview
skiy8 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
小小小点8 小时前
Android四大常用布局详解与实战
android
MinQ9 小时前
binder和socket区别及原理
android