Android遊戲設計初體驗

今天玩了一下在Android寫game,託以前經驗的福,很容易就上手了,和一般的Game沒有太大的差別,但因為Android所謂的main-thread和main-loop都是用來回應UI用的,因此要更新遊戲的邏輯、畫面,需要另外的Thread,參考Android裡的遊戲範例,很快地就隨便寫出一個還稱不上是Game的小程式來玩,只是簡單地移動貼圖,在模擬器跑慢到暴炸,FPS只有1初頭,根本沒辦法進行debug,而在我的HTC Magic下跑FPS可以到30~40左右,所以要在Android開發遊戲似乎實體的手機是必需的,模擬器平時跑一般的程式都可以慢成誇張的地步了,更何況是不停更新的Game,所以非手機或其它硬體支援不可,除非哪天模擬器效能大改進

簡單的貼圖移動

雖然這小程式沒什麼大問題,但是有件事情讓我很困擾,就是每隔一點段時間就會發生delay,週期性且不斷地發生,這樣的delay會讓玩家感到不爽,難以進行遊戲,糾~竟~是為什麼會有這週期性的delay,我們…繼續看下去

Delay的兇手

找了一些資料,終於讓我發現這週期性delay的兇手,就是來自於garbage collection的週期性回收垃圾,請看VCR

在Android寫一個簡單的貼圖移動程式,發現會有週期性的delay,原因出在於垃圾回收機制不停地週期性地運作,請看背後LogCat的GC發生的一瞬間,程式的畫面就會delay

而亂丟垃圾的兇手就是….

我,沒有什麼寫Java經驗的我,new一個物件似乎很輕鬆平常,反正Java有垃圾回收機制,一般寫程式再怎麼丟都有人幫你撿,但是寫Game就是另一回事了,對於寫Game而言,垃圾回收機制是delay的來源,所以在遊戲迴圈內不能有用完即丟的new物件產生,任何物件在遊戲都應該被reference或是重覆利用,不停丟垃圾的下場就是你的遊戲會因為有人一直停下來幫你撿垃圾所以不停的delay

當我移除所有new之後…

我發現delay似乎還是會發生,想了一想,想到了在這背後還有隱含的new會發生,也就是Java的字串其實骨子裡就是new,只是方便的寫法所以不用特別寫出來,在移除了所有使用到暫時字串的地方後,果然圖片的移動就相當順暢

接著

我想寫一個簡單的地圖引擎實作來看看Android的2D貼圖效能如何,如果不幸的很不夠力,可能就得用OpenGL下去畫2D了

This entry was posted in Android, 中文文章, 遊戲設計 and tagged , , , . Bookmark the permalink.

One Response to Android遊戲設計初體驗

  1. 包子 says:

    站長可以玩玩看這個國產的android遊戲,還蠻屌的
    Market Link: https://market.android.com/details?id=com.light.roller