2011-06-10 81 views
13

我有一個繪圖應用程序,用戶可以用他們的手指畫線,調整顏色,厚度等。當用戶正在繪製時,我將集成的X/Y點從MotionEvent轉換爲SVG Paths ,然後創建Android Path's,然後通過Canvas將Android路徑繪製到屏幕上,並將SVG路徑提交到應用程序的數據庫。Android:Canvas vs OpenGL

我下面在FingerPaint使用的模型,在該「正在處理」線重複調用繪製在飛invalidate()(因此,onDraw()),一旦該行是完整的,新線開工,先前的線是從CanvasBitmap中抽取的onDraw(),並且正在進行的線再次產生重複的重新繪製。

在此應用程序中此工作正常 - 直到您開始旋轉底層的Bitmap以補償設備旋轉,從而支持在圖面上「放大」的能力,從而不得不縮放底層的Bitmap等等。 ,旋轉設備並繪製圖形,當用戶繪圖時,我們需要在onDraw()中縮放並旋轉我們的位圖,這絕對是爬行。

我看過SurfaceView,但由於這仍然使用相同的Canvas機制,所以我不確定我會看到明顯的改進......所以我的想法轉向了OpenGL。我曾經在某處讀過OpenGL可以做旋轉和基本上'免費'縮放,甚至看到rumors(第三條評論),Canvas可能會在未來的版本中消失。

本質上,我有點卡在Canvas和OpenGL解決方案之間...我有一個2D繪圖應用程序,似乎完美適合在一個狀態下的Canvas模型,因爲沒有不斷重新繪製一個遊戲(例如,當用戶沒有繪製時,我不需要任何重新繪製),但是當用戶繪製時,我需要用表面來做一些日益複雜的事情所必需的最大性能...

歡迎任何想法,指針和建議。

回答

4

OpenGL將能夠輕鬆處理旋轉和縮放。

老實說,你可能需要學習很多的OpenGL要做到這一點,具體涉及到的主題:

  • 幾何
  • 照明(或只是禁用它)
  • 採摘(選擇幾何畫就可以了)
  • 像素地圖
  • 紋理映射
  • 紋理映射

而且,學習OpenGL的,這可能是矯枉過正,你就必須非常善於它,使之高效。

相反,我會建議使用建立在OpenGL上的遊戲庫的圖形組件,如:

1

你說得對,SurfaceView在引擎蓋下面使用了Canvas。主要區別在於SurfaceView使用另一個線程來執行實際繪圖,這通常會提高性能。這聽起來像它不會幫你很多,但。

你是對的,OpenGL可以非常快速地進行旋轉,所以如果你需要更多的性能,那就是要走的路。你應該使用GLSurfaceView。使用OpenGL的主要缺點是做文本是一件非常痛苦的事情。基本上你必須(好吧,不必,但似乎是最好的選擇)渲染文本的位圖。

+0

幸運的是,我不會做任何文本,只是Android路徑,所以文本問題可能不會出現。 – 2011-06-10 17:19:44

0

那麼,這問題在6年前問過。也許Android 4.0還沒有出來? 實際上,在Android 4.0之後,android.view.View上的Canvas是一個硬件加速的畫布,這意味着它是由OpenGL實現的,因此您不需要使用其他方式來獲得性能。

可以看到https://github.com/ChillingVan/android-openGL-canvas/blob/master/canvasglsample/src/main/java/com/chillingvan/canvasglsample/comparePerformance/ComparePerformanceActivity.java比較鑑於與GLSurfaceView正常畫布的性能。