日期:2014-05-20  浏览次数:20772 次

控制每秒刷新固定帧数,线程休眠、等待哪个更合理
TIME_IN_FRAME = 50;//50毫秒
Java code

long startTime = System.currentTimeMillis();  

//一帧的绘制运算 消耗时间不同
...
      
/** 计算出更新本次帧所消耗的毫秒数 **/  
int diffTime = (int) (System.currentTimeMillis() - startTime);        
              
/** 确保每次更新时间为50帧 **/
//方式1 线程休眠时间不同的影响需要查一下,再决定用何种方式
try {
    Thread.sleep(TIME_IN_FRAME-diffTime);
} catch (InterruptedException e) {
    e.printStackTrace();
}
//方式2 用线程等待
while (diffTime <= TIME_IN_FRAME) {  
    diffTime = (int) (System.currentTimeMillis() - startTime);  
    //线程等待   
    Thread.yield();  
}


想请教一下那种方式更合理,或者有更专业的解决方案
(直接隐约记得那篇文章中说每次线程休眠的时间不同会有不良影响,不过具体是不是会有影响,产生影响原因是神马也没有深究,故有哪位大牛了解的话也请不吝赐教,万分感谢)

------解决方案--------------------
顶一下。
------解决方案--------------------
帮顶!!
------解决方案--------------------
不用顶了,推荐你看看Andrew Davison的《Killer Game Programming in Java》这本书,里面就有现成的程序
------解决方案--------------------
3楼正解,你的两种方法都有问题。
Java code

public void run( )
    /* Repeatedly: update, render, sleep so loop takes close
       to period ms */
    {
      long beforeTime, timeDiff, sleepTime;

      beforeTime = System.currentTimeMillis( );

      running = true;
      while(running) {
        gameUpdate( );
        gameRender( );
        paintScreen( );

        timeDiff = System.currentTimeMillis( ) - beforeTime;
        sleepTime = period - timeDiff;   // time left in this loop

        if (sleepTime <= 0)  // update/render took longer than period
          sleepTime = 5;    // sleep a bit anyway

        try {
          Thread.sleep(sleepTime);  // in ms
        }
        catch(InterruptedException ex){}

        beforeTime = System.currentTimeMillis( );
      }

      System.exit(0);
    } // end of run( )