2012-03-31 28 views
6

我正在開發一款android.Like塔防遊戲。 我正在使用表面視圖。我使用一些圖像作爲位圖。(Spritesheets,tilesets,buttons,backgrounds,efects vs.) 現在圖像接近5-6 mb.And運行我的遊戲時出現此錯誤:當遊戲開發時,位圖大小超過虛擬機預算

位圖的大小超過VM預算

19464192字節外部分配太大,這一進程。

我把這樣的

BitmapFactory.decodeResource(res, id) 

圖像和我把它給陣列。 我無法縮放圖像,我正在使用它們全部。 我試過

options.inPurgeable=true; 

和它的工作,但圖像加載非常slowly.I負載,一個spritesheet和它加載的時候,我變得非常非常低的FPS。

我能做些什麼?

回答

0

我不是一個遊戲開發者,但是我想我認爲我知道Android足夠了。

加載大小的圖像幾乎肯定會拋出錯誤。爲什麼文件大小的圖像?

http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/有一個例子。如果你注意到他有一個只有〜200Kb的爆炸精靈。即使更詳細的圖像也不會佔用太多的文件空間。

OK了一些建議:

  • 你加載所有您spritesheets到一張紙或者是 在一個單獨的文件中的每個spritesheet?如果他們都在一個我會 拆分它們。

  • 降低圖像的分辨率,Android設備是便攜式的 和一些只有一個低分辨率屏幕。例如,HTC Wildfire具有240x320(LDPI設備)的分辨率,並且相當普通的設備是 。您尚未說明圖片尺寸,因此我們無法確定這是否實用。

最後;我不是一名遊戲程序員,但我發現本教程(同一系列的一部分)頗具啓發性 - http://p-xr.com/android-tutorial-2d-canvas-graphics/。我不知道你是否正在應用一種不適合Android的模式,但是沒有代碼我不能說。

右的東西有點題外話,但值得一提...

低估人民觀的能力。雖然使用SurfaceView有一定的邏輯,但標準View本身會有很多功能。 SurfaceView往往需要一個底層線程才能運行(你必須自己設置)才能使其工作。然而,視圖調用onDraw(),可以以多種方式使用,包括postinvalidate()方法(請參見What does postInvalidate() do?)。

在任何情況下,可能值得看看本教程http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/。就個人而言,這是一個自定義視圖的好例子,你可以用它們做什麼。我重寫了幾個部分並製作了一個懷錶應用程序。

+0

我非常感謝您的幫助,但我無法解決。 我使用大的spritesheet,因爲有太多的動畫。例如,這是從我的遊戲中的生物的spritesheet: http://nafiz.in/bigeye.png 我使用星系和我使用這個spritesheets全尺寸。首先,我必須在我的設備上工作。 也許,有7-8 MB的位圖限制。我再次研究,我發現解決這個問題,我必須使用jni或opengl.But那一點,我不能使用它們。也許是其他項目。所以我會刪除一些動畫和堆管理工作。 – 2012-04-03 16:54:12

2

我也有這個問題;除了減少您一次加載的位圖數量/大小之外,真的沒有其他解決方案。一些較舊的Android設備僅爲您的整個應用程序分配16MB的堆,並且一旦加載它們,位圖就會存儲在未壓縮的內存中,所以在大背景等情況下不會超過16MB。(854x480,32位位圖是關於1.6MB未壓縮。)

在我的遊戲中,我能夠通過僅加載我將在當前級別使用的位圖來解決它(例如,我有一個單獨的Bitmap對象用於從資源中重新加載的背景時間它的變化,而不是在內存中維護多個位圖。我只是保持跟蹤我已經當前加載其資源的int)

你的精靈表是巨大的,所以我覺得你說得對,你需要減少動畫的大小。另外,從資源中加載的速度也相當快,所以你可以通過加載角色當前方向的動畫條來避開,並且當他用新的動畫條替換它時,讓他稍稍暫停。雖然這可能會變得複雜。

此外,我強烈建議在虛擬機堆設置爲16mb的模擬器上測試您的應用程序,以確保您已解決所有設備的問題。 (模擬器通常默認爲24MB,因此很容易就可以進行未經測試,並在發佈後生成一些1星評論。)

相關問題