加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Compose 渲染性能究竟怎么样?

发布时间:2023-03-24 11:03:28 所属栏目:教程 来源:
导读:去年曾经写过一篇文章调研Compose的性能:相比 XML,Compose 性能到底怎么样?
不过这篇文章主要是从包体积,页面首次打开时间来分析Compose的性能,而Compose作为一个UI框架,相信大家更关注它的渲染性能比如FPS,本
去年曾经写过一篇文章调研Compose的性能:相比 XML,Compose 性能到底怎么样?
不过这篇文章主要是从包体积,页面首次打开时间来分析Compose的性能,而Compose作为一个UI框架,相信大家更关注它的渲染性能比如FPS,本文主要就是从FPS的角度来分析Compose的性能

如何测量Compose的FPS
Compose列表渲染性能分析
Compose粒子动画渲染性能分析
如何测量Compose的FPS
所谓FPS也就是每秒显示的帧数,Android 设备的 FPS 一般是 60,也即每秒要刷新 60 帧,所以留给每一帧的绘制时间最多只有 1000/60 = 16.67ms 。一旦某一帧的绘制时间超过了限制,就会发生 掉帧,用户在连续两帧会看到同样的画面。

监测Android应用的FPS,其实已经是相当成熟了,主要就是利用Choreographer.getInstance().postFrameCallback()方法,在这里就不缀述了。
那么,我们该怎么监听Compose的FPS呢?利用Choreographer监测仍然适用于Compose吗?
其实Choreographer依然可以用来监测Compose的FPS,不过Compose提供了更加方便的API供我们使用:withFrameMillis

withFrameMillis本质上是对Choreographer代码的封装,它会在下一帧到来时回调,并且会返回下一帧开始绘制的时间
下面我们来看下如何利用withFrameMillis来监测Compose的FPS

@Composable
fun FpsMonitor(modifier: Modifier) {
    var fpsCount by remember { mutableStateOf(0) }
    var fps by remember { mutableStateOf(0) }
    var lastUpdate by remember { mutableStateOf(0L) }
    Text(
        text = "Fps: $fps", modifier = modifier
            .size(60.dp), color = Color.Red, style = MaterialTheme.typography.body1
    )
    LaunchedEffect(Unit) {
        while (true) {
            withFrameMillis { ms ->
                fpsCount++
                if (fpsCount == 5) {
                    fps = (5000 / (ms - lastUpdate)).toInt()
                    lastUpdate = ms
                    fpsCount = 0
                }
            }
        }
    }
}
代码逻辑很简单:

withFrameMillis会返回每一帧开始绘制的时间,两帧开始绘制时间的差值就是一帧绘制的时间
1000/(ms-lastUpdate)就是1秒内可以绘制的帧数,也就是FPS
为了避免帧数抖动过快,我们每5帧计算一次平均FPS,也就是fps = (5000 / (ms - lastUpdate)).toInt()
Compose列表渲染性能分析
关于Compose的列表的性能问题也是老生常谈了,很多人都说Compose的LazyColumn在低端手机上会卡顿,那么我们就来分析比较一下同一个页面用LazyColumn与RecyclerView分别实现,在性能上有什么差距?

同时在debug包与release包都进行了以上测试,结果基本一致。可以看出,LazyColumn与RecyclerView在性能上的确有一定差距,尤其在低端手机上,LazyColumn快速滑动时掉帧明显,而RecyclerView则都很流畅
只能说RecyclerView太强了~

Compose粒子动画渲染性能分析
除了列表,我们也可以通过粒子动画的方式来测量Compose的性能,通过粒子动画我们可以评估在极端情况下Compose与View的渲染性能

首先来看下粒子动画效果:

如上,我们可以在画布上生成随机粒子并且做动画,随着粒子数量的增长,观察应用的FPS,以此评估Compose的渲染性能,我们同时也实现了一个View版本以进行对比。

可以看出,随着粒子数从100增长到10000,应用的FPS逐渐降低,在低端手机上尤其明显

而与列表不同的是,Compose与View在粒子动画中的渲染性能几乎一致,可以说是几乎没有区别
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章