2011-06-29 45 views
3

這是我最後一個問題的一個後續跟進:Canvas is drawing too slowly在SurfaceView上加載和顯示jpeg的最快方法?

現在我可以更快地繪製圖像,我面臨的問題是圖像的實際加載時間太長。

在我工作的應用程序中,用戶可以連續播放視頻幀(jpegs),就好像他正在實時查看視頻一樣。我一直在使用BitmapFactory.decodeFile()來加載位圖中的每個jpeg。我無法一次加載所有圖像,因爲它們中有大約240個,並且會佔用我所有的堆空間。我一直在做的是通過一個單獨的線程一次將多達6個預加載到一個數組中,以便減少每個圖像顯示所花費的時間。

不幸的是,它需要50到90ms之間來加載圖像,我需要顯示一個圖像每42毫秒。有沒有更快的方式來加載圖像可能?

爲了便於說明,這些圖像位於SD卡上的文件夾中,它們都是720x480 jpegs。我正在採樣他們的一半大小,以減少內存使用量。

+0

使用內部存儲器或使用png而不是jpeg時,您是否看到過任何差異? – mibollma

+0

我還沒有嘗試過內存,我想我會試試下。我開始使用png,但它們比jpeg大得多,而且jpeg在設備上佔用了大約8MB的空間。 – BigFwoosh

+0

使用內部存儲器似乎有點快,但它對於我所做的還不夠快。我認爲我真正需要的是一種在不犧牲質量的情況下存儲所有圖像的方法。如果將inSampleSize設置爲4,我可以將它們全部存儲在內存中,但質量會大幅下降。 – BigFwoosh

回答

1

我最終做得比我最初設想的有點不同。有相當多的它,但這裏是我如何實現我的目標要點:

  1. 所有圖像都存儲在SD卡上,並寫入到一個文件中(每個圖像佔用文件中的X字節)
  2. 使用本機代碼,以讀取和寫入到圖像文件
  3. 當請求一圖像,我通過在列表中的位圖對象(RGB_565),以使用JNI本機代碼的圖像的索引包裝器
  4. 的本地代碼鎖定位圖表面,將像素數據(作爲uint8_t **)直接寫入位圖,然後解鎖它
  5. 將圖像渲染到屏幕

通過這樣做,我只需要一次在內存中存儲一​​張圖像,並且我能夠繞過垃圾收集(因爲位圖只創建一次,然後本地重新填充)。我希望別人會發現這個策略很有用。

0

猜你已經試過本教程中的所有方法http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/並選擇了最快的方法。也許調整大小可以減少加載時間。

最重要的當然是如果你根本不需要調整圖像大小。如果你完全控制了圖像,也許你可以嘗試將它們打包成精靈,請參閱文章http://www.droidnova.com/2d-sprite-animation-in-android,471.html

+0

不幸的是,我將不得不調整圖像大小,因爲現在很多Android設備可以以高分辨率錄製視頻,但其屏幕尺寸較小。我也不能將圖像作爲資源引用,因爲它們實際上是在運行時從設備上的視頻文件生成的。我想我可以看到在生成圖像時調整圖像的大小。 – BigFwoosh

相關問題