2013-01-23 183 views
0

當您在Android中使用SurfaceView時,尤其是將它們設置爲佈局的一部分時(通過將SurfaceView添加到佈局XML中),性能是至關重要的一個方面。加速Android中的SurfaceView,每隔幾秒只更新一次

就我而言,View僅每隔幾秒更新一次(包含撲克遊戲中的撲克牌,有一些效果和觸摸事件),並且由於它是較大布局的一部分,因此我遇到了以下問題這SurfaceView減慢我的Activity的用戶界面的其餘部分,即其餘的Activity凍結一段時間,然後它被更新,以便短時間沒有顯示。

public class MySurface extends SurfaceView implements SurfaceHolder.Callback { 
    ... 
} 

在其onDraw()方法,有吸引到黑色背景一些Bitmap秒。裏面那類,一個線程開始連續調用ViewonDraw()方法:

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class SurfaceThread extends Thread { 

    private SurfaceHolder mSurfaceHolder; 
    private MySurface mSurface; 
    private boolean mRunning = false; 

    public HandThread(SurfaceHolder surfaceHolder, MySurface surface) { 
     mSurfaceHolder = surfaceHolder; 
     mSurface = surface; 
    } 

    public SurfaceHolder getSurfaceHolder() { 
     return mSurfaceHolder; 
    } 

    public void setRunning(boolean run) { 
     mRunning = run; 
    } 

    @Override 
    public void run() { 
     Canvas c; 
     while (mRunning) { 
      c = null; 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) { 
        if (c != null) { 
         mSurface.onDraw(c); 
        } 
       } 
      } 
      finally { // when exception is thrown above we may not leave the surface in an inconsistent state 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 

} 

不幸的是,這會減慢我的Activity不時,這意味着有大約凍結的0.5秒經常。

有沒有可能加快速度?我試圖放棄Thread,並在每次撥打onTouchEvent()時致電invalidate(),但這也不起作用。

我認爲必須有一種方法來提高性能,因爲SurfaceView不經常更新。有幾秒鐘什麼也沒有發生,但當用戶觸摸View時,事物一直在四處移動,直到手指擡起。

回答

1

你會想分析真正導致這些暫停的東西。 Trace through一個典型的運行,看看實際使用的CPU時間。有可能,有些東西導致UI凍結,你正在做很多工作,應該是moved to another thread

你也想避免不必要的工作。你絕對想看的東西是確保在你的後臺循環中(包括調用onDraw)避免儘可能創建新的對象。這將減少垃圾收集,也可能導致打嗝。如果可能的話,也儘量避免或最小化加載位圖。

+0

非常感謝!首先從UI線程調用onDraw()?因爲在隨後的調用中,我從另一個線程(手動)調用它,但在我看來,好像第一個調用是由UI在UI線程上完成的。 – caw

相關問題