2011-02-08 58 views
3

目前,我正在使用計時器和Canvas.onDraw()/canvas.drawBitmap在全屏幕SurfaceView上顯示單幀動畫。每一幀的分辨率爲480x320像素,並將在繪製時延伸至屏幕分辨率。這可以在更快的設備上安靜地工作,實現高達15 fps的幀速率。問題是我必須在動畫開始之前加載每一幀(動畫由30個循環的單幀組成),因爲動畫將以高幀率顯示。鑑於通常爲16 MB的Android進程的小堆空間,我的大多數測試設備都無法將所有30幀預加載到內存中,因此我正在考慮使用OpenGL代替。當我讀取OpenGL時,內存將不會被認爲在16 MB的進程堆空間內,使用OpenGL可能是另一種選擇。使用Android上的OpenGL繪製全屏單幀動畫?

現在我的問題是:OpenGL是否足夠快地改變和顯示紋理(我的單幀)足夠快,以達到15fps的高幀率?我讀過一篇文章說,交換紋理往往會顯着減慢OpenGL的速度。你們有沒有經驗?我不想花時間讓OpenGL運行,如果你已經可以說用15fps交換全屏紋理是不可行的。

編輯:

我現在用的是使用默認的Android NDK未做利用OpenGL的技術。看我的answer here

+0

你只會改變紋理每幀一次。這並不常見。 – Alan 2011-02-08 16:27:44

+0

這聽起來很像你試圖解決錯誤的問題。爲什麼*需要* 30個未壓縮的全屏位圖在內存中?任何你無法在你的電腦上建立你的30幀到.avi的原因,包括作爲你的.apk資產,然後通過MediaPlayer播放它? – 2011-02-08 16:30:48

回答

2

OpenGL性能還取決於您將使用的設備。但在大多數設備上以15fps顯示30個紋理不會成爲問題。

看看this article,從Android上的OpenGL開始。實現循環動畫相當簡單。

祝你好運!

0

沒有更多需要利用OpenGL在我的情況下,由於30幀可以在不超過可用空間被加載。當我發現運行garbage collector可以釋放一些在加載我的30幀期間佔用的內存。這不是我誰創造了這些對象可以釋放蜜蜂,因爲我的代碼看起來像這樣:

for (int i=0; i < 30; i++) { 
    Bitmap b = "load480x320BitmapFromResources(i)"; 
    frames.add(b); 
} 

此之前的代碼將超過堆空間。但加入該行

System.gc(); 

在循環內允許加載所有這些資源。奇怪,因爲我沒有自己創建對象,但我猜Android框架的一些內部位圖加載代碼是這樣做的。

See also a more detailed description of this solution