簡體   English   中英

位圖太大 - 內存不足?

[英]Bitmap too large - Out of Memory?

我試圖在我的設備上動畫一些人的動作。 我創建了一個精靈表,最終為1.23Mb。 圖像尺寸為5000 x 1500像素。 工作表有8行,每行都是自己的動作。 (繼續,鞠躬,跳......)。 最長的動作是32張圖像。 所以圖像基本上是32列,共8行。 所以,現在我加載它:

我一做到這一點:

private Bitmap bmp;
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.myImage);

我收到一個錯誤:

線程[<1> main](暫停(異常OutOfMemoryError))
BitmapFactory.decodeResource(Resources,int,BitmapFactory $ Options)行:385 BitmapFactory.decodeResource(Resources,int)行:404
GameView。(上下文)行:25 FightActivity.onCreate(Bundle)行:13 FightActivity(Activity).performCreate(Bundle)行:4465
Instrumentation.callActivityOnCreate(Activity,Bundle)行:1049
ActivityThread.performLaunchActivity(ActivityThread $ ActivityClientRecord,Intent)行:1920
ActivityThread.handleLaunchActivity(ActivityThread $ ActivityClientRecord,Intent)行:1981 ActivityThread.access $ 600(ActivityThread,ActivityThread $ ActivityClientRecord,Intent)行:123
ActivityThread $ H.handleMessage(消息)行:1147
ActivityThread $ H(Handler).dispatchMessage(Message)行:99 Looper.loop()行:137 ActivityThread.main(String [])行:4424
Method.invokeNative(Object,Object [],Class,Class [],Class,int,boolean)line:not available [native method] Method.invoke(Object,Object ...)行:511 ZygoteInit $ MethodAndArgsCaller.run( )行:784
ZygoteInit.main(String [])行:551 NativeStart.main(String [])行:不可用[native method]

我限制在某個文件大小? 好像很奇怪? 如果是這樣,我唯一的選擇就是將精靈分割成單獨的“動作”圖像,而不是在一個大的精靈表中每行動作一系列動作圖像?

希望有人可以協助新手。

一個簡單的計算可​​以得到答案。 假設每像素32位,您有((5000x1500)像素)*(每像素32位)/(每字節8位)/(每Mb 1024 * 1024位)= 28MB。

我做了谷歌搜索,我看到不同版本的Android和不同手機的默認堆大小從16MB到32MB不等。 我想我看到最常見的24MB。 因此,您的圖像很可能只是內存不足。 看看這篇文章,了解你的堆大小: https//stackoverflow.com/a/9428660/1448071

編輯:似乎沒有一種方法可以增加Android的VM堆大小。 有一個VMRuntime.getRuntime()函數,其中有一個setMinimumHeapSize函數,這里描述了Android:如何在運行時增加堆大小? 但它似乎被棄用了。 我建議你拆分你的精靈。

為角色中的每個動畫創建一個spritesheet,保持對常見動畫的引用,並根據需要加載。 這很靈活,你的動畫不會滯后,除非你需要從內存加載位圖更改,例如當你從運行變為空閑或其他東西時(雖然這兩個很常見,你可以把它們保存在記憶很久了)。

增加VM堆大小只是部分解決方案,如果您將位圖保持得如此之大,許多設備將無法獲得所需的堆大小。 就像他們上面說的那樣,磁盤上的圖像文件大小對於在Google Play上部署應用程序非常重要(用戶可以下載更少)但是在ram上圖像是完全原始的,這意味着每個像素都計數(例如:一個完全紅色的128x128位圖需要與完全彩色的相同的空間,具有完全相同的顏色深度)。

我為你提出了一個解決方案,它正在使用這個非常棒的軟件(除了我自己使用它並且非常棒),它會立即創建你的spritesheets並以各種格式導出坐標給你采用。 TexturePacker

您需要增加VM堆大小。 我很樂意為你抓取鏈接,但我想這是我能做的最好的atm - 用Java增加堆大小

根據圖像的復雜程度,另一個答案可能是使用矢量圖形。 有許多庫具有不同級別的文檔和許可要求。

例; http://www.andengine.org/

https://play.google.com/store/apps/details?id=org.anddev.farmtower.eco (此游戲中使用的AndEngine)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM