2011-02-02 22 views
9

我根據我的比賽中lunarlander例子,一直有口吃的問題,因爲我第一次開始做吧。沒有什麼我曾嘗試已經擺脫了他們,所以我已經得到的地方,我已經花了幾個小時創建lunarlander例子的一個精簡版的點,在把一個簡單的滾動圖像來顯示口吃。注意:它與垃圾回收器無關。如果你認爲是這樣,只要看看日誌,垃圾收集器就不會運行 - 就像出現口吃一樣頻繁。,我無法擺脫的怪異口吃問題(完整的源包括)

在我的手機上摩擦大約1/10秒,屏幕上的圖像大約每秒鐘都會出現口吃(摩托羅拉里程碑,2.2)。這種口吃並不完全摧毀遊戲玩法,但它非常令人分心和令人沮喪。我的遊戲還涉及很多快速滾動和快速移動,因此它在那裏通常更加明顯。

如果你們有時間,你可以快速瀏覽一下這個Eclipse項目,看看:

  1. 它口吃你在手機上(仔細看,因爲它滾動,它具有體積小掛鉤每半秒到一秒半)
  2. 如果你能看到什麼辦法來解決口吃

我希望我只是有一個代碼行遲緩,是造成這整個事情沒有我實現。我簡直不能相信,即使剔除口吃的這麼多它仍然具有完全相同的量我的1000個對象全場比賽,特別是因爲它運行在我的手機上了堅實的60fps之後。

編輯:具有一定輪廓上Traceview我的遊戲,它似乎罰款。

源下載鏈接:http://dl.dropbox.com/u/4972001/LunarLander.rar

+2

您是否試圖與traceview剖析你的遊戲? http://developer.android.com/guide/developing/tools/traceview.html – bigstones 2011-02-02 21:11:57

+1

是的,我看起來很好 - 每個「updatePhysics」調用之間還有間隙,而且沒有調用,我看不到任何不尋常的間隙。 – Smills 2011-02-02 21:20:57

+1

我不確定是否是我,但我認爲有一個*勉強*明顯的口吃(試用LG Optimus One 2.2) – bigstones 2011-02-02 22:21:11

回答

0

這聽起來像您滾動會產生大量的垃圾,需要頻繁地收集。如果你正在創造大量的短期小物件,考慮管理你自己的池。只要你不讓游泳池無限增長,這可以大大減少gc搶佔你的時間。

1

我嘗試了我的手機(Nexus One的),它是我也一樣。

我做這使我們更好地爲我的幾個變化:

  1. 相反循環中每一次宣佈新的變量,我宣佈爲類

    帆布C =空的性能; //變得

    私人帆布℃;

    //在循環現在只用

    C =空

這樣做對所有您在doDraw和updatePhysics函數聲明一遍又一遍的變量。

  1. ,而不是增加了空想的,直到永遠,我只放一點點,如果衆所周知聲明

    如果(空想的> mCanvasHeight){

    viewY -= mCanvasHeight; 
    

    }

我不知道它現在是否100%工作,但對我來說似乎更好。

0

我在Verizon DroidX(2.2.1)上測試過它,它看起來每3-6秒和非常短暫。這看起來好一點,關閉活動牆紙,沒有別的運行。圖形子系統可能跟不上?您是否嘗試過使用更少的圖形密集圖像(像素更少,顏色更少),以查看它的功能?

0

您正在繪製每幀三個巨大的背景位圖...這是比您需要做更多的工作。使用TileMode集重複使用BitmapShader可能會更好。然後它只是一個調用到本地層。

某處添加Paint paint;成員,改變你的setSurfaceSize()包括下面幾行:

BitmapShader shader = new BitmapShader(mBackgroundImage, 
    TileMode.CLAMP, TileMode.REPEAT); 
paint = new Paint(); 
paint.setShader(shader); 

然後doDraw()僅需要是這樣的:

//translate to viewY position 
canvas.translate(0,(float)(-viewY)); 

//draw backgrounds 
canvas.drawPaint(paint); 

我沒有實際測量這證明它速度更快,但是從我對圖形API的瞭解,它肯定應該是。

(當然,如果你真的飛你應該使用OpenGL ES ...)