【问题标题】:High frequency UI update - Android高频 UI 更新 - Android
【发布时间】:2019-11-28 21:15:50
【问题描述】:

我想让 8 个方块周期性地在红/黑之间改变颜色。 我使用timer.schedule 完成此操作,周期时间以毫秒为单位,它可以工作

但后来我意识到我需要在这些转换之间使用一小段时间(例如纳秒)。

为了实现这一点,我编写了以下代码:

timerTask = new TimerTask() {
    public void run() {
        handler.post(new Runnable() {
            public void run(){

                //CODE OF THE TASK.

            }
        });
    }
};


//To make schedule this task in 5 nanoseconds I use this!
exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(timerTask, 0, 5, TimeUnit.NANOSECONDS);

但是当我运行这个时,UI 没有更新(似乎卡住了),但是在 logcat 中,所有日志都打印得非常快。如何实现以 x 纳秒的周期定期执行任务?

【问题讨论】:

  • 如果颜色在纳秒内变化,人眼不应该是看不见的吗?
  • @ReazMurshed 我会这么认为。我需要使周期小于 1 毫秒。
  • 如果你想要少一点,那么你可能不会考虑NANOSECONDS,因为它少了很多。实际上,中间还有另一个 TimeUnit.MICROSECONDS

标签: android scheduled-tasks periodic-task


【解决方案1】:

整个 Android UI 以 60Hz- 每秒 60 次更新的频率运行。这意味着重绘之间的最短时间为 16 毫秒。您不能以更高的帧速率运行它。人眼也无法以比这更高的频率看到变化。

iOS 和大多数视频游戏机也以 60 Hz 的刷新率工作。您会发现速度更快的系统很少,甚至没有。

我不确定你到底想要完成什么,但我相当肯定你试图以错误的方式做。

另外:我注意到您的计时器任务发布到处理程序。这意味着您的计时器任务将告诉主线程运行某些东西,并且计时器任务在纳秒内运行。你基本上会阻塞你的主线程充满“运行这个任务”消息,然后当事件队列变得如此庞大以至于无法再添加时(这可能需要几分钟)最终崩溃并出现 OOM 错误,因为有由于线程切换开销,您无法以足够快的速度处理它们。

【讨论】:

  • 感谢您的宝贵时间。如何在没有 OOM 的情况下以正确的方式在 x 微秒(纳秒?)内完成此周期性任务
【解决方案2】:

在做了很多研究之后,我意识到为了让视图刷新得如此之快,我需要使用 SurfaceView 和一个线程来使 UI 重绘非常快,我真的不知道这一点。感谢您的帮助

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多