2011-01-30 59 views
5

我正在尋找示例代碼示例,展示如何使用 Android SurfaceView每秒達到30幀?假設每個框架從x和y位置開始繪製一個圓,每個框架將x和y增加1。如何使用Android SurfaceView實現每秒30幀?

獎勵問題: 除上述之外,我想覆蓋另一個視圖以顯示文本內容,以便在此文本內容下顯示任何圖形。如何做到這一點?

回答

3

讓一個線程執行此30次:

  1. 呼叫SurfaceHolder.lockCanvas()。
  2. 繪製到畫布中(必須完全重繪所有像素)。
  3. 調用SurfaceHolder.unlockCanvasAndPost()。

事實上,如果你的線程只是坐在那裏做,而不試圖暫停,它將被扼殺到屏幕的幀速率。

您需要確保該線程與表面視圖的管理正確同步 - 例如,如果表面正在更改或被銷燬,那麼您的代碼應該與線程同步以確保線程停止運行有時候是這樣的。

當然這意味着你正在軟件渲染到畫布中。根據你在做什麼,這可能很好,給你30幀/秒的動畫。如果沒有,你需要使用GLSurfaceView。無論如何,您可能會考慮使用它,只是因爲它會爲您處理線程部分。

6

如果你想要高幀率,你真的需要閱讀GLSurfaceView。在正常的表面視圖下,您將受到費用佈局計算和以CPU爲中心的渲染的束縛。藉助GLSurfaceView,您可以將其卸載到GPU上,並對佈局進行嚴格有效的控制。

+0

GLSurfaceView能加速繪圖(因爲你使用OpenGL繪製的話)。它不排除佈局計算......事實上,在繪製過程中不應該有佈局計算,甚至是繪製常規視圖層次結構。 – hackbod 2011-01-30 22:10:41

+1

「它不會擺脫佈局計算」 - 我說過了嗎? 「在繪圖期間不應該有佈局計算髮生」 - 我沒有說我是不是?但是,談論**幀速率**通常意味着某些東西在移動/改變,這會影響佈局計算。如果你使用本地佈局管理器,這將是昂貴的。 – 2011-01-30 23:32:44

2

這可能是一個古老的線程,但我認爲這可以幫助其他人。 這裏是一個很好的教程中,我使用surfaceView發現: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

這裏是關於如何實現遊戲環,它可以幫助限制FPS 30一篇好文: http://www.koonsolo.com/news/dewitters-gameloop/

您可以添加文字直接向您的surfaceView如果你喜歡, 下面是一個例子

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
}