2011-04-14 70 views
0

我正在開發一個將繪製模擬時鐘的動態壁紙應用程序。到目前爲止,我已經達到了使用三個位圖繪製時鐘的程度:撥號,時針,分針。在畫布上繪製旋轉的位圖很慢:還有其他選項嗎?

當我畫小時和分鐘我做這樣的(僞代碼):

// without this it looks weird after rotate 
Paint smoothPaint = new Paint(FILTER_BITMAP_FLAG); 
canvas.drawBitmap(dialBitmap, 0, 0, null); 

canvas.rotate(ANGLE_FOR_HOUR_HAND, w/2, h/2); 
canvas.drawBitmap(hourBitmap, 0, 0, smoothPaint); 

canvas.rotate(ANGLE_FOR_MINUTE_HAND, w/2, h/2); 
canvas.drawBitmap(minuteBitmap, 0, 0, smoothPaint); 

這工作,除了我得到一個非常低幀率好:約13幀。 如果我關閉位圖過濾,它會增加到約24 fps,但對我而言仍然很低。

我知道在Canvas上繪製的2D圖不會以任何方式加速,但仍然想要問有沒有其他選項可以加速此代碼?以某種方式本地繪製位圖?也許還有其他的東西?

利用OpenGL是一種選擇,但由於其LiveWallpapers不那麼簡單不支持GL繪圖,所以我需要使用第三方黑客(我知道存在)對於我寧願不做......

回答

2

「其他選項?」你問。你有兩個:

  1. 不要使用位圖。例如,第二個Cube SDK示例彈出了一個以25 fps旋轉的20行十二面體。
  2. 正如你所提到的,你有時可以在動態壁紙中使用「黑客」來製作特殊用途的圖形。我建議你至少要看看以下三個...你可能會發現它們有用一天:AndEngine(有一個動態壁紙擴展),LibGDX(允許你在桌面環境中的原型;動態壁紙設施仍在開發中,以及GLWallpaperService(專門設計用於將GLSurfaceView帶入動態壁紙)。

在你的文章中,你說24fps對你來說「仍然很低」。我的理解是24fps大約是人類感知的極限(無論如何,這是Flash默認使用的)。爲了延長電池的使用壽命,我建議你不要更高,即使可以。

編輯:另一個「黑客」考慮:renderscript。這就是許多手機配備的複雜壁紙(銀河,草地,水)的工作原理。看到renderscript在這裏啓用java文件:https://android.googlesource.com/platform/packages/wallpapers/Basic/+/master/src/com/android/wallpaper

+0

感謝您的回覆:)編號1)不計數,我的意思是「其他選項」爲這個確切的設置 - 顯示旋轉圖像: )2)你提供了一個非常好的信息,謝謝。我會看看AndEngine。我已經知道GLWallpaperService,已經使用過了,正如我所說的,我現在不想使用它 - 我要求在2D Canvas中提供選項。關於libgdx + livewallpapers的非常有趣的信息 - 我知道那個很好的lib,它對於它的支持真的很酷:)如果你對我發現的更多東西感興趣,可以增加fps,請參閱我自己的答案:) – dimsuz 2011-04-17 17:04:42

+1

@dpimka剛剛編輯的答案,以添加renderscript到「黑客」的全景。可能沒有用於你目前的目的,但有些事要熟悉......祝你好運。 – 2011-05-13 17:51:04

1

如何在每次分針更改時將手形配置渲染到中間位圖,然後將每個幀的靜態位圖渲染到畫布上?

+0

是的,謝謝。我也考慮過這個問題,這樣可以,但我想添加一個不斷動畫的二手作品(對不起,忘了提及這個)。而且分針每秒會提前一小部分 - 我精確計算其位置(旋轉到浮動角度)。所以看來,我仍然需要旋轉他們幾乎所有的每一幀... – dimsuz 2011-04-14 17:23:22

+0

我剛剛發現了一件事,幫助我:減少手位圖的大小。早些時候,他們的屏幕尺寸與周圍的透明像素。剪掉這些透明像素後,旋轉變得更有效率(如預期的那樣)。 – dimsuz 2011-04-14 17:34:25

0

發現幾件事情,有助於提高幀速率,將張貼在這裏的回答爲自己:)

首先是使用Canvas.drawBitmap(位圖,矩陣,油漆)超負荷供應矩陣,而不是使用canvas.save() + canvas.rotate() + canvas.restore() - 效率更高。

第二:減小位圖的大小。早些時候,他們被填充到接近屏幕尺寸的hdpi(480pix),並在其周圍添加了透明像素。剪掉這些透明像素並修改了渲染代碼來解決這個問題後,旋轉變得更加高效(如預期的那樣)。

+0

使用Canvas.drawBitmap(Bitmap,Matrix,Paint)旋轉480x480位圖需要多長時間?它帶我約10mS在雙核1 GHz Cortex-A9似乎slooow – steveh 2014-07-13 03:34:57