【问题标题】:Android: Is a while loop efficient?Android:while循环有效吗?
【发布时间】:2011-04-14 12:19:45
【问题描述】:

目前我正在使用以下构造:

while(continue)
{
    if(somethingChanged)
    {
        draw();
    }
}

这种等待方式是否有效,或者有更好的方法吗?

--

根据要求,提供更多信息:

我在 SurfaceView 上绘图,线程锁定 Canvas 并调用 onDraw(Canvas) 方法。当我绘制的东西没有改变时,我不需要调用 onDraw(Canvas) 方法,所以我保留一个布尔值 somethingChanged。

另外,当我触摸屏幕时,我会在触摸点画一个圆圈,所以当我触摸屏幕时,somethingChanged 为真。

【问题讨论】:

  • 发现信息不足。无法回答。
  • 您正在等待更改的内容是什么?你在画什么?

标签: android performance drawing


【解决方案1】:

您还可以使用wait() 并在某些内容发生更改时将其他线程设为notify()(如果其他线程更改了somethingChanged)。

【讨论】:

  • 但在效率方面,这是否比运行循环“更好”?
  • 是的,当然,在wait() 期间,您的线程将被暂停并使用 0% CPU 而不是 100%(如果您使用无限循环)。并且显示将在您需要时准确更新。使用sleep(),您仍将使用很少的 CPU,但绘图不会完全实时。
【解决方案2】:

你可能在做游戏,我推荐这篇文章:http://dewitters.koonsolo.com/gameloop.html 有非常好的可能的解决方案可以满足你的要求。

【讨论】:

  • 确实,这是一本非常好的读物。但是如果您的游戏在用户空闲时不需要重绘自己,您可能找不到问题的答案(本文仅考虑您希望获得最高 FPS 的游戏)
【解决方案3】:

Android 在空闲循环方面具有比 std java 方法更好的机制。 它由一个 Looper 和一个为你工作的 Handler 组成:

Handler myHandler;
...
public void run() { 

       Looper.prepare(); //this tells Android that your thread will contain a loop

       myHandler = new Handler() {

              public void handleMessage(Message msg) {
                      draw();  
              }
       };
Looper.loop; //starts the loop
}

调用 draw 方法所需要做的就是向该处理程序发送消息,而不是设置布尔变量。

Message mess;
myHandler.sendMessage(mess)

这样,您也可以将该消息中的任何对象发送到循环中,并且 android 会为您执行线程同步和消息队列的工作。而且 - 最重要的是 - 它也很高效。

【讨论】:

    【解决方案4】:

    如果没有任何改变,这是一个无限循环,很可能会使用 100% cpu,所以我想说你至少应该添加一些 Thread.sleep() 调用,让其他线程有机会做某事(例如,更改somethingChanged的值)

    【讨论】:

      【解决方案5】:

      通常,在无限循环中,您应该有一些机制来避免它占用 cpu 的所有时间。例如,这是通过睡眠来完成的。即使是短暂的睡眠也会减轻处理器的使用。 假设这段代码在一个线程中:

      while(continue)
      {
          if(somethingChanged)
          {
              draw();
          }
          Thread.sleep( mySleepTime );
      }
      

      【讨论】:

      • 那么只有 30 毫秒的睡眠就足够了? (为了让我的圈子顺利移动)
      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 2012-07-18
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2019-04-04
      相关资源
      最近更新 更多