2012-12-04 49 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

如果您在显示线程上运行,你只能处理并以最快的速度线程允许绘制。我可能会建议在另一个线程中绘制位图,然后使用曲面支架解锁,绘制位图并发布。