2011-02-04 27 views
7

我在過去6個月左右一直在研究Android遊戲,並且在這裏發佈了幾次關於我無法擺脫的各種滯後問題。是不可能讓Android遊戲免費的嗎?我在這裏瘋狂

我最終抓住了LunarLander的例子,並將其剝離到它的核心組件,看看我是否能夠做任何不滯後的事情。它所做的只是更改畫布每幀的翻譯量,然後在畫布上繪製背景。即使這樣,你可以得到一個SurfaceView應用程序一樣簡單 - 口吃...

我的遊戲是一個滾動遊戲,你不斷向上移動屏幕(想象飛行遊戲),但我目前的方式做背景會導致大約50-100毫秒每秒不斷的口吃。這不是遊戲突破,但它非常分散注意力,使得遊戲看起來好像是由一個完整的白癡編程的(儘管我開始懷疑這可能是這種情況)。

不,它不是垃圾收集器,在遊戲的運行循環中根本沒有創建新對象,並且GC在我的遊戲運行時幾乎沒有運行。

我實際上把我的頭髮弄得沮喪。我花了超過40個小時,試圖擺脫這個簡單的應用程序例子在上個星期的滯後,這讓我瘋狂。應用程序如何與我所鏈接的應用程序一樣簡單可能存在滯後問題?你不會認爲滾動的背景可能會比這更簡單...

注意:這個演示在我的手機(摩托羅拉里程碑)上不斷獲得60fps左右。在示例中取消註釋FPS代碼以查看FPS。

TL; DR:非常簡單的程序,只是一個滾動的背景顯示口吃。請看看...

基於鏈路斷LunarLander例如下載簡單的口吃例如: http://dl.dropbox.com/u/4972001/LunarLander.rar

+0

是否噴氣男孩演示有口吃上運行時,您的手機? http://developer.android.com/resources/samples/JetBoy/index.html – jhouse 2011-02-04 16:04:32

+0

Traceview告訴你什麼?另外,在將來,請跳過火焰誘餌標題。 – CommonsWare 2011-02-04 16:12:40

+0

對不起火焰誘餌,當我寫出來的時候,我非常沮喪(因爲我相信你可以說)。 Traveview沒有什麼特別之處。所有draw/updatePhysics調用之間有相同的間隔。這似乎是可見但不可衡量的東西,這是令人困惑的。另外,是的,JetBoy也有口吃問題。 – Smills 2011-02-04 16:18:15

回答

4

我已經下載了RAR文件與滾動背景(看起來像一片草地),並安裝它在我的Motorolla Droid上。

我可以感覺到沒有口吃,因爲它滾動,我已經觀察了一分鐘。

根據你的描述,我打賭里程碑硬件/平臺有一些奇怪的視頻繪圖/計時問題。

也許解釋是這樣的:里程碑的diplay刷新頻率爲60Hz(只是在這裏選擇一個數字,我不知道它是什麼),而且你的幀速率略微偏離了這個水平 - 比如說63或57赫茲......難以想象,大約每秒一次的抽獎時間,以及硬件顯示更新不匹配的時間恰好足以使背景不會重新畫一次,並且必須等到你的下一幀?偶爾,時序排列恰到好處,您可能會錯過連續兩次或三次繪製的時間(取決於您的幀週期離實際屏幕刷新週期有多遠)。

編輯:其實,我看了一分鐘,我確實看到一個很短(只是可感知)口吃。

0

您是否考慮過jhouse對最小幀時間的建議?

我在當前項目中使用了這個想法。我預計手機硬件在未來一兩年會有相當大的改進,所以這會阻止你的遊戲在未來變得不可玩。

我的代碼是這樣的:

long frameTime; // calculate time to process this frame 

    while (mSurfaceAvailable) { 
     // ensure minimum frame time can be calculated 
     frameTime = SystemClock.uptimeMillis(); 

     // code to move everything and display a single frame goes here 

     // ensure minimum frame time 
     frameTime = SystemClock.uptimeMillis() - frameTime; 
     if (frameTime < 0) frameTime = MIN_FRAME_TIME;  // cope with wrap-around of uptimeMillis 
     if (frameTime < MIN_FRAME_TIME) { 
      /*DEBUG*/Log.v(this.getClass().getName(), "run: Sleeping for "+(MIN_FRAME_TIME - frameTime)+"ms"); 
      try { 
       sleep(MIN_FRAME_TIME - frameTime); 
      } catch (InterruptedException e) { 
       /*DEBUG*/Log.i(this.getClass().getName(), "run: Thread sleep was interrupted (not a problem)"); 
      } 
     } else { 
      if (frameTime != MIN_FRAME_TIME) { 
       /*DEBUG*/Log.v(this.getClass().getName(), "run: System is too slow, by "+(frameTime - MIN_FRAME_TIME)+"ms per frame"); 
      } 
     } 

我睡眠異常,從一個論壇處理(大概這一個!),但從未見過拋出異常

1

我一直有這個相同在我的比賽中有一個滯後的問題(我做了類似你對LunarLander循環的類似的結論,並得出了類似的結論)。如果你打開logcat,你會發現滯後與GC_FOR_MALLOC(50 ... 100 ms,我們的滯後時間)一起發生。我懷疑問題的根源在於垃圾收集器。然後我發現這個職位:

http://fanitis.com/2011/02/09/android-game-performance-garbage-collection/

我會盡量減少使用垃圾收集,看看我實現無滯後狀態呵呵呵=]