2012-09-15 86 views
1

我做這個小碼:關於線程和延遲時間

public class Game1Activity extends Activity { 

/** Called when the activity is first created. */ 
private final Handler handler = new Handler(); 
private final Runnable run = new Runnable() 
{ 
    public void run(){ 
     update(); 
    } 
}; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    update(); 
} 

public void update(){ 
    try 
    { 
     Log.i("update thread", "updated"); 
    } 
    catch (Exception e) 
    { 
     Log.i("update thread", "catched an exception!"); 
    } 
    finally 
    { 
     handler.postDelayed(run, 33); 
    } 
    } 
} 

就像你看到的,有關於它沒有什麼特別的其他比它在日誌聊天更新,每33毫秒寫入(每秒30幀)

這裏是我的問題,如果u可以從日誌聊天看:

09-15 09:01:05.955: I/update thread(423): updated 
09-15 09:01:06.025: I/update thread(423): updated 
09-15 09:01:06.097: I/update thread(423): updated 
09-15 09:01:06.166: I/update thread(423): updated 
09-15 09:01:06.236: I/update thread(423): updated 
09-15 09:01:06.305: I/update thread(423): updated 
09-15 09:01:06.374: I/update thread(423): updated 
09-15 09:01:06.444: I/update thread(423): updated 
09-15 09:01:06.513: I/update thread(423): updated 

線程運行約每70毫秒,雙倍時間意! 爲什麼會發生?我的線程是最基本和最簡單的,可以,我懷疑它是否有延遲它的東西

有沒有更好的方法來使其更新完全按照預期?

回答

2

處理器需要切換線程的內容。 33毫秒有點低。

,如果您使用300毫秒,如果你想每秒30幀,嘗試和你有30毫秒的延遲,比1毫秒嘗試是

handler.postDelayed(); 

可接受的值。

+0

我試了1000毫秒,即1秒,仍然有一個延遲,它每1020/1030ms更新。所以如果300毫秒是最低的,我應該如何讓應用(遊戲)每33毫秒更新一次(30幀/秒)? –

+0

是的,有一個調度時間,比處理器需要切換應用程序和應用程序之間的線程(任務管理器)。更改正在運行的線程會產生開銷,例如20-30毫秒,它會爲該切換任務增加更多CPU使用率 – 2012-09-15 09:18:27

0

最近我在我的軟件代碼部分使用此代碼:

this.timer.scheduleAtFixedRate(new TimerTask() { 
    public void run() { 
     //do something here: probably update(); 
    } 
}, 0L, this.INTERVAL); 

它應該是相同的延遲。

編輯:

import java.util.Timer; 
import java.util.TimerTask; 

...

private Timer timer = new Timer(); 

的shedule文檔here。與其他計劃方法相比,這應該專注於WHEN的計劃,但我忘記了我在哪裏閱讀過。我希望其中的一種方法能幫助你。

+0

是否可以解釋此處寫入的內容?我對「.timer」有錯誤。部分... –