2012-10-22 94 views
5

我正在開發一個小型圖書館作爲一些應用程序的基礎。由於我要創建一個場景圖(2D)我想知道以下哪些方法看起來的性能,可維護性視野下更有前途,使用方便等畫布操作與元素操作

  1. 我可以給每個繪製元素的矩陣,其中我執行翻譯,旋轉和更多。
  2. 我可以在畫布上做所有事情而不是元素。

第一溶液具有的缺點:

private float get(int index) { 
    final float[] values = new float[9]; 
    getValues(values); 
    return values[index]; 
} 

public float getX() { 
    return get(Matrix.MTRANS_X); 
} 

public float getY() { 
    return get(Matrix.MTRANS_Y); 
} 
:對於像圓形,在不能在繪圖調用傳遞矩陣基本元素,我必須從矩陣這樣訪問翻譯過的值

因此,在每個繪圖調用中,我爲每個getter調用創建一個float數組(一個用於getX(),另一個用於getY())。假設我在屏幕上有很多元素,這可能會導致內存和性能的影響。

第二種方法有「負面」思維的缺點。如果我想在100/100點繪製一個元素,我必須將畫布轉換爲-100/-100,就像我在0/0上繪製一樣。如果我在此之後恢復畫布,結果將是在想要的100/100上繪製的元素。我不確定這種負面的想法是否會對代碼可維護性造成嚴重影響,並且會降低理解力(甚至從來沒有開始考慮通過簡單地忽略某些東西來引入錯誤)。

有人有提示哪種方式應該是首選嗎?

回答

2

看來,確實這兩種解決方案必須結合一個完美的方式。

我對第二種方法的假設是完全錯誤的。如果我將元素轉換爲100/100,則原點將更改爲100/100。當然,這同樣適用於畫布。消極的想法是我完全廢話。

的綜合結果將是如下:

  1. 將被繪製,有自己的Matrix,在包含旋轉,平移和縮放每個元素。
  2. 畫布將通過save()保存,所提供的方法concat(Matrix matrix)可應用元素的矩陣。繪圖將完成,畫布將被恢復爲restore()
  3. 作爲其他drawable的父項的每個可繪製元素將遍歷子元素並以相同的方式保存,連接和恢復。

這使得2D場景圖的實現沒有任何大的實現工作。

1

由於性能方面的原因,使用內部矩陣方法可能會更快,因爲它允許庫自動進行硬件加速,如果這就是您正在做的。然後再次,我不完全確定它是否會硬件加速。

#2是有趣的方式。從長遠來看,它肯定會給你更多的權力和靈活性。另外,你也許可以將兩者結合起來。還有#3:當你說可繪製元素時,如果你使用的是Android Drawables,你可以創建一個自定義的Drawable類。

我不認爲有這樣做

+1

我發表了我的研究成果。我無法從你的答案中得到任何新東西,但我讚揚你的努力。 – WarrenFaith