2013-08-04 43 views
0
@Override 
public void run() { 
    super.run(); 

    final float timePerFrame = 1000/Options.MAX_FPS; 
    float timeDiff; 
    while(!isInterrupted() && isRunning) { 
     timeDiff = System.currentTimeMillis(); 
     mController.refresh(); 
     timeDiff = timePerFrame - (timeDiff - System.currentTimeMillis()); 

     try { 
       Thread.sleep(Math.max(Math.round(timeDiff), 0)); 
     } catch(InterruptedException e) { 
      // do nothing 
      e.printStackTrace(); 
     } 
    } 
    Log.e("GameThread", "Thread dead."); 
} 

這是我的線程基本上在做什麼。我的繪圖線程突然停止的原因是什麼?

Options.MAX_FPS = 30; 

要限制幀每秒,每個刷新之間有某種休眠時間。刷新方法如下所示:

public synchronized void refresh(){mrotation = Math.round((360 +((-1)* mAccelerometer [0] * 4.5f))%360); mObject.setRotation(mRotation);

// get canvas from surfaceview 
    if(mSurfaceHolder != null) { 
     // do all calculations. 
     if(Looper.myLooper() == Looper.getMainLooper()) { 
      log("on main thread!"); 
     } else { 
      log("Not on main thread"); 
     } 


     Canvas mCanvas = mSurfaceHolder.lockCanvas(); 
     if (mCanvas != null) { 
      // shift x offset 
      mScreenWidth = mCanvas.getWidth(); 
      mScreenHeight = mCanvas.getHeight(); 

      // draw black background, clear everything. 
      mCanvas.drawRect(new Rect(0,0,mScreenWidth, mScreenHeight), mBlackPaint); 

      // shift & draw all viewobjects if still visible 

      for(ViewObject view: mViewObjectList.toArray(new ViewObject[mViewObjectList.size()])) { 
       view.shiftX(-1 * Options.Gameplay.Environment.MOVING_SPEED); 
       if(view.getX() + view.getWidth() < 0) { 
        mViewObjectList.remove(view); 
       } 
       if(view.getCurrentBitmap() != null) 
        mCanvas.drawBitmap(view.getCurrentBitmap(), new Rect(0,0,view.getCurrentBitmap().getWidth(), view.getCurrentBitmap().getHeight()), new Rect(view.getX(), view.getY(), view.getX()+ view.getWidth(), view.getY()+view.getHeight()), new Paint()); 

       view.nextFrame(); 
      } 

      // draw object 
      final Bitmap sBitmap = mObject.getCurrentBitmap(); 
      mObject.nextFrame(); 
      if(sBitmap != null) { 
       mCanvas.drawBitmap(sBitmap, new Rect(0, 0, sBitmap.getWidth(), sBitmap.getHeight()), new Rect(mObject.getX(), mObject.getY(), sBitmap.getWidth(), sBitmap.getHeight()), new Paint()); 
      } else log("bitmap = null!"); 
     } 

     mSurfaceHolder.unlockCanvasAndPost(mCanvas); 
    } 
} 

線程繼續運行一段時間後,背景元素都被吸收(即使我的旋轉不工作相當尚未,但這是另一個故事。),背景「似乎」移動(像側),但在某個隨機時間點,沒有任何ADB LogCat消息(不限於應用程序,而是整個LogCat輸出) - 線程停止。沒有更多的繪圖。沒有。我沒有調用中斷或設置isRunning爲false,因爲「Thread dead」。消息不會寫入LogCat中。 我不知道發生了什麼。 感謝您的幫助。

回答

1

您有:

enter code here`timeDiff = System.currentTimeMillis(); 
// refresh, which takes some time I guess 
timeDiff = timePerFrame - (timeDiff - System.currentTimeMillis()); 

所以System.currentTimeMillis的()在後面,因此比大的timeDiff。括號中的術語將爲負數 - 因此您將添加到timePerFrame,timeDiff將不會減少。

相關問題