2014-07-23 39 views
0

我目前正在製作Android動態壁紙。在這個特定的壁紙中,我有一個從使用觸摸位置生成的圓形陣列。在應用程序的設置中,我將允許它們更改所述功能的分辨率,因爲這涉及到這一點。因此,我寫了我自己的反鋸齒循環函數。加速Android drawRect調用

渲染是通過類似於粒子的效果完成的 - 我計算矩形的顏色,並將其與圓形一起傳遞,並相應地渲染它們。這些矩形爲我存儲值,所以我需要分別渲染每個值。爲了加快速度,我盡了一切努力 - 爲各種顏色預先計算Paint對象(幾個足夠有效且仍然有效的對象),預先計算了矩形的座標等。但是,我仍然在速度上失去了渲染循環 - 一個簡單的循環,遍歷任何有顏色的矩形並將其應用於屏幕。

我不做任何操作,但比較矩形是否着色,矩形的值直接從數組中拉出哪個Paint對象。我怎樣才能在這裏獲得速度?我無法將分辨率提高到超過16像素的方塊,而不會變得難以忍受。

下面是是瓶頸的代碼片斷:

 c.drawRect(0, 0, c.getWidth(), c.getHeight(), p); 
     for(int x = 0; x < sizex; x++) 
     for(int y = 0; y < sizey; y++){ 
      if(tiles[x][y] != 0){ 
      if(tiles[x][y] > 100) 
       tiles[x][y] = 100; 
      c.drawRect(rects[x][y], ps[tiles[x][y]]);//This seems to be the bottleneck 
      } 
     } 

所以,在本質上是有到drawRect()的另一種方法,這將是更快?

+1

您可能需要顯示代碼中有問題的部分,以便任何人確定如何優化它。 –

回答

1

三件事情要考慮:

  1. 多維數組訪問是比單維的慢一點。但我認爲這是可以忽略不計(Java: Multi-dimensional array vs. One-dimensional

  2. 相反的drawRect你可以考慮使用drawLines一次繪製所有rects的所有行。這比多次撥打drawLine要快。這就是爲什麼我認爲它比多個drawRect s更快。但我沒有任何證據。

  3. 繪畫畫布慢。如果性能很重要,你應該使用表面視圖(儘管我不知道這是否適用於LiveWallpapers)。如果性能很重要,或者對於粒子和這些高級圖形的東西,我強烈建議使用OpenGL,或者像libGDX這樣的庫。

+1

作爲一個額外的鏈接去與這個答案,快速搜索顯示http://www.learnopengles.com/how-to-use-opengl-es-2-in-an-android-live-wallpaper/ 謝謝! – Bioniclegenius

+0

©Bioniclegenius確實是一個很好的資源 – Lovis