java實現遊戲的迴圈及遊戲幀數處理
阿新 • • 發佈:2019-01-01
引言:
製作遊戲對遊戲的迴圈處理無疑是重要的,只有處理對遊戲的迴圈,才不會出現遊戲的卡頓現象。我們知道遊戲中的動畫是由一幀幀的靜止的畫面形成的,那麼如果每一幀的畫面因為機器處理的不同使得渲染時間不同,會使得遊戲卡頓。一般的小遊戲的FPS在60到100之間,FPS就是遊戲畫面的更新速率,代表每秒鐘更新畫面的次數,這裡我們暫且取每一幀的更新時間為0.016秒,也就是FPS約為62。如果想要達到非常流暢的效果可以增大FPS,但切記最好不要使每一幀的時間小與其渲染時間(介紹完程式碼後就會理解是為什麼了)。
遊戲更新的主迴圈程式碼和註釋如下:
以上便是遊戲介面更新的主迴圈執行緒,之前說的FPS不要非常大是因為如果機器的效能不好,或介面需要渲染的東西很多會導致渲染時間比較長,這樣每一幀更新的時間就不能很好的控制,就會導致遊戲的卡頓。 之所以像上面那樣設定睡眠時間是為了保證在渲染時間在可控的範圍內時,每一幀的更新時間一致這樣遊戲才會變的流暢。 希望對大家有幫助。如果有寫的不好的地方望指出。class MainThread implements Runnable{ GameView Game=GameMainActivity.Game;//將遊戲的主介面傳入,GameView和GameMainActivity是自己定義的類 @Override public void run() { //這裡是真正意義上的主迴圈,要記錄時間 //真正意義上的開始時間,0點 //經過時間 long update=0;//用於記錄遊戲渲染的時間 long sleep=0;//用於記錄遊戲執行緒睡眠的時間 while(true){//如果想要很好的中斷遊戲執行緒,可以把true變為自己規定的boolean變數,通過改變變數值中斷遊戲 long before=System.nanoTime();//得到當前時間點,注意nanoTime()得到的是個時間點其數值並不是實際意義上的時間 long t=sleep+update;//用於記錄上一幀花費的時間 Game.updateAndRender(t/1000f);//遊戲介面的更新和渲染,該方法是自己在主介面中定義的 update=(System.nanoTime()-before)/1000000L;//這裡是計算渲染的總共時間 sleep=Math.max(2,16-update);//因為我們規定了每一幀的睡眠時間是 16毫秒,所以在2和渲染後還剩餘的時間中取個最大值作為睡眠時間,設2是為了防止渲染時間太長 try { Thread.sleep(sleep); } catch (InterruptedException e) { e.printStackTrace(); } } } }