gpt4 book ai didi

java - 如何同步到 Android 帧速率

转载 作者:行者123 更新时间:2023-12-02 13:09:03 25 4
gpt4 key购买 nike

我正在寻找一种将某些代码 Activity 同步到 Android 显示帧速率的方法。这是一小段代码,仅用于设置小显示区域的颜色,仅此而已。我可以利用某种方法或 Hook 来实现此目的吗?

我可以成功地使用以非常快的时间间隔运行的计时器,但渲染似乎会受到帧速率锯齿的影响。例如,我的帧速率是 60 Hz,因此如果我将计时器间隔设置为 1/60 秒,则外观会不均匀。我无法将计时器设置为 16.666 毫秒,即使可以,我仍然会看到锯齿。

谢谢。

最佳答案

我知道这是一个老问题,但我自己也遇到了这个问题,并创建了一个很好的小实用程序类来完成此任务。

Kotlin 类:


/**
* Small utility class that allows for [doFrame] to be executed every frame based on the native
* [Choreographer] instead of using precomputed values and timers.
* [doFrame] is run on the main thread and is executed on the next frame.
* The [SyncedRenderer] can be restarted freely.
*/
class SyncedRenderer(val doFrame: (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 = {}
}
}

用法:


val renderer = SyncedRenderer { frameTimeNanos: Long ->
// My code here will execute on main thread every frame
}

// Example when dragging something

override fun onStartDrag() {
renderer.start()
}

override fun onReleaseDrag() {
renderer.stop()
}

我发现它的性能仅比仅使用固定速率Timer 并在每帧刷新率下运行代码稍好一些。

但是,通过此实现,您不会在后台线程上运行任何代码,因此在修改 View 时不需要调用任何类型的 post 或其相关方法>s.

更重要的是,尽管不会执行不必​​要的额外执行,但与使用硬编码刷新率计时器相比,这对于更平滑的滚动和动画非常有用。

希望这对某人有帮助:)

关于java - 如何同步到 Android 帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44036646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com