Android获取当前应用FPS(帧数)

Android 获取应用FPS帧率

找了很久都没有找到获取应用帧率的方法,所以决定写一篇文章用来获取帧率。

本次使用的语言是Kotlin


1. 首先我们使用的API是Choreographer这个类,这里涵盖这每一帧绘制的时间,使用纳秒来计算的,所以我们需要操作他
 Choreographer.getInstance().postFrameCallback(callback)

注意,上方方法只会调用一次,来获取当前帧率的开始绘制时间,具体可以参考Choreographer.FrameCallback这个接口的注释,在这里不再多做阐述,由于调用一次就会获得一帧的计算时间,所以我们要达到效果的话需要用递归的方法来进行取值,所以参考国外的一篇帖子封装了一下。

2. 获取帧率时间关键代码

递归来调用Choreographer.getInstance().postFrameCallback(callback) 方法

class SyncedRenderer(val doFrame: SyncedRenderer.(frameTimeNanos: Long) -> Unit) {

    private var callback: (Long) -> Unit = {}

    fun start() {
        callback = {
            doFrame(it)
            Choreographer.getInstance().postFrameCallback(callback)
        }
        Choreographer.getInstance().postFrameCallback(callback)
    }

    fun stop() {
        Choreographer.getInstance().removeFrameCallback(callback)
        callback = {}
    }
}
3.计算获得帧率

本方法使用顶级函数封装,这里是计算20帧取平均值,可以通过传参动态改变
这里是回调20次求平均值,然后向上保留两位小数

fun getFps(count: Int = 20, fpsResult: (Double) -> Unit) {
    var tempCount = count
    var fpsSum = 0.0
    var currTime = 0.0
    val renderer = SyncedRenderer {
        if (currTime != 0.0) {
            val temp = it / 1000000.0 - currTime
            fpsSum += 1000.0 / temp
            tempCount--
            if (tempCount <= 0) {
                stop()
                val fpsNum = fpsSum / count
                val fpsFormat = BigDecimal(fpsNum).setScale(2, BigDecimal.ROUND_HALF_UP).toDouble()
                fpsResult(fpsFormat)
            }
        }
        currTime = it / 1000000.0
    }
    renderer.start()
}
4.方法调用

方法调用非常简单,帧率计算是作为回调传出来的,想直接返回请自行修改

 getFps {
            LogUtils.e("zzaFps", it)
        }

觉得有用的话,欢迎点个赞~

你可能感兴趣的:(Android,android,kotlin)