0

我的應用程序需要加載建築平面圖,然後在平面圖上繪製對象(傢俱)。平面圖是一個2500 x 1500 240Kb的PNG,但frackin'BitmapFactory通過需要12 + Mb的堆來創建位圖,導致我出現OutOfMemory錯誤,從而使大多數設備崩潰。讓我在這裏清楚一點:據我所知,這不是一個內存泄漏,bitmap.recycle()什麼也不做,因爲第一次創建第一個映像時它會崩潰。使用inSampleSize讀取圖像沒有幫助,除非我使用樣本大小來呈現圖像無法識別。這整個情況都很瘋狂。我正在測試Droid 3,HTC Inspire和兩個2.3仿真器。 HTC將載入地圖,模擬器的128Mb(可笑)堆大小也是如此。 這個應用程序的部署將用於Android用戶的範圍,所以我不能做任何針對高於2.3的設備。android-我應該使用GLSurfaceView而不是Canvas來避免bitmapfactory?

這裏是我當前的代碼,這給了我一個無法使用的圖像(從另一個SO職位,對不起,我已經失去了鏈接):

BitmapFactory.Options o=new BitmapFactory.Options(); 
     o.inJustDecodeBounds=true; 
     BitmapFactory.decodeResource(getResources(), resourceId, o); 


     //Find the correct scale value. It should be the power of 2. 
     int scale=16; 
     while((o.outWidth/scale)>=REQUIRED_SIZE || (o.outHeight/scale)>=REQUIRED_SIZE) 
      scale*=2; 

     BitmapFactory.Options options=new BitmapFactory.Options(); 
     options.inSampleSize = scale; 

     Bitmap base_image; 
     try { 
      base_image = BitmapFactory.decodeResource(getResources(), resourceId); 
     } catch (Error e1) { 
      base_image = BitmapFactory.decodeResource(getResources(), resourceId, options); 
     } 

一會這裏GLSurfaceView解決我的問題?我需要它1)加載平面圖圖像,2)允許我以編程方式繪製對象和文本標籤,以及3)支持基於平面佈置圖座標的縮放和對觸摸作出反應。如果這是答案,任何人都可以推薦這樣的基本2D工作的好教程嗎?

+0

提示:PNG的文件大小沒有任何意義,因爲它是壓縮的。在內存中使用時,每個像素都有(通常)32位或16位(4或3字節)。這意味着您的2500 x 1500圖像需要15兆字節的內存。 – Jave

+0

對,我在另一個問題中發現。你如何建議我處理這種情況? – cschryer

回答

0

有許多方法可以減少位圖的內存使用量,如果您選擇使用openGL,則可以使用可以直接發送到視頻內存的預先壓縮的紋理。 Android本身支持ETC1紋理,如果我沒記錯的話,ETC會減小25%的尺寸。 但是,由於您在openGL方面沒有任何經驗,並且還需要執行稍微複雜的操作,例如繪製文本,所以這可能不是您的最佳操作(儘管通過此方法您可能會在舊設備上獲得最佳性能)。你可以考慮使用任何引擎(AndEngine或Box2d是流行的)。

對於您來說,一個更快和更好的選擇可能是創建平面圖的矢量表示(例如SVG文件)(如果您有簡單的背景顏色和牆壁線條,這應該是可能的)。如果您想要更高級的圖像,請使用Path類或外部庫進行繪製。

+0

我正在從第三方獲取平面圖文件,我不認爲有可能獲得除PNG以外的任何內容。我會研究ETC,看看我能否理解/使用它。謝謝。 – cschryer

相關問題