2012-12-04 104 views
0

我遇到了SurfaceView的問題。如何繪製更快? SurfaceView,SurfaceHolder dirty rect

函數DrawWave由定時器調用間隔5ms,但實際上它需要兩次調用之間超過30ms,(我試過刪除drawColor,drawPath)。

我試過「模式1」和「模式2」,通過使用骯髒的矩形,希望它可以運行得更快。間隔是相同的,都超過30ms,(寬度爲800px,而eScrX-sScrX < 20px)

問題1:使用SurfaceView/SurfaceHolder做錯了嗎?

問題2:我能做些什麼來提高繪圖速度?我希望它能在10毫秒內完成繪圖。

我的代碼:

public class VS_VChannel extends SurfaceView 
{//Wave Show Class 
    //------------------------------------------------------------------------------- 
    private Paint paint = new Paint(); 
    private SurfaceHolder sHolder = null; 
    private Canvas cvs = null; 
    private Path P = new Path(); 
    //Data source of the wave point Y 
    protected VSChannel Channel = null; 
    private float drawY; 
    //------------------------------------------------------------------------------- 
    public VS_VChannel(Context context) 
    { 
     super(context); 
    } 
    //------------------------------------------------------------------------------ 
    public VS_VChannel(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     //Bind the wave data source whith AttributeSet name:vs_wave 
     String vsName = attrs.getAttributeValue(null, "vs_wave"); 
     Channel = (VSChannel)VS.GetItem(vsName);//Find the wave data source from collection with name 
     // 
     paint.setAntiAlias(true);   
     paint.setDither(true); 
     paint.setColor(Channel.getColor()); 
     paint.setStyle(Paint.Style.STROKE);  
     paint.setStrokeWidth(2);     
     // 
     sHolder = this.getHolder(); 
     this.setZOrderOnTop(true); 
     sHolder.setFormat(PixelFormat.TRANSPARENT); 
    } 
    //------------------------------------------------------------------------------ 
    /** DrawWave is Call by a timer Interval 5ms, 
    * BUT actually it need more than 30ms between twice call,(tried delete drawColor, drawPath) 
    * I try as "Mode 1" and "Mode 2", by using Dirty rect, hope it can run faster 
    * The Interval is the same, both more than 30ms, 
    * (The width of this is 800px, and eScrX-sScrX<20px) 
    */ 
    protected void DrawWave(int sScrX, int eScrX) 
    { 
     Rect rect = new Rect(sScrX, 0, eScrX+8, getHeight()); //Mode 1  
     //Rect rect = new Rect(0, 0, getWidth(), getHeight()); //Mode 2 
     // 
     cvs = sHolder.lockCanvas(rect);  
     cvs.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
     cvs.drawPath(P, paint); 
     sHolder.unlockCanvasAndPost(cvs); 
    } 
    //------------------------------------------------------------------------------- 
    protected void GetWaveY() 
    { 
     drawY = Channel.GetWaveY(getHeight()); 
    } 
    //------------------------------------------------------------------------------- 
    protected void MoveTo(float x) 
    { 
     P.moveTo(x, drawY); 
    } 
    //------------------------------------------------------------------------------- 
    protected void LineTo(float x) 
    { 
     P.lineTo(x, drawY); 
    } 
    //------------------------------------------------------------------------------- 
    protected void DrawReturn() 
    { 
     P.reset();//Clear 
     P.moveTo(0, drawY); 
    } 
    //------------------------------------------------------------------------------- 
} 
//------------------------------------------------------------------------------- 

回答

0

如果您在顯示線程上運行,你只能處理並以最快的速度線程允許繪製。我可能會建議在另一個線程中繪製位圖,然後使用曲面支架解鎖,繪製位圖併發布。