繁体   English   中英

我用SurfaceView做错了什么?

[英]What I'm doing wrong with SurfaceView?

我试图使用SurfaceView绘制某些东西,但看起来像这样的绘画越来越慢,而不是使用onDraw和View Class无效。

所以我需要知道我是否可以使其更快。 这是我的代码。

public class ViewCentroMesa extends SurfaceView implements Runnable
{



    // Bucle pintar
    Thread t = null;
    SurfaceHolder holder;
    boolean isItOk = false;

    public ViewCentroMesa(MesaActivity mesaActivity, Mesa mesa) 
    {
        super(mesaActivity.getContext());

        setZOrderOnTop(true);

        setWillNotDraw(false);

        holder = getHolder();

        holder.setFormat(PixelFormat.TRANSLUCENT);

        isItOk = true;
        t = new Thread(this);
        t.start();

}

@Override
protected void onDraw(Canvas canvas) 
{
    super.onDraw(canvas);

    /* Tapete */
    try 
    {
        dibujarTapete(canvas);  
    } catch (Exception e) {}

    this.sentido = mesaActivity.getSentidoBitmap();
    this.miIcono = mesaActivity.getMiIcono();
    this.mazo = mesaActivity.getMazo();

    /* Cartas A Robar */
    try 
    {
        dibujarCartasARobar(canvas);
    } catch (Exception e) {dibujarCartasARobar(canvas);}

    /* Sentido */
    try 
    {
        dibujarSentido(canvas);
    } catch (Exception e) {}

    /* Mi icono */
    try 
    {
        dibujarMiIcono(canvas);
    } catch (Exception e) {}

    //if (getMesa().isJuegoAcabado()) return;
    boolean cond = mesa.isMiJugadorAcabo();
    if (cond) return;


    /*Cartas Tiradas */
    try 
    {
        dibujarCartasTiradas(canvas);
    } catch (Exception e) {e.printStackTrace();}

    /*Carta mesa */
    try 
    {
        dibujarCartaMesa(canvas);
    } catch (Exception e) {}

    /* Carta Tirada*/
    try 
    {
        dibujarCartaTirada(canvas);
    } catch (Exception e) {}

    /* Mazo */
    try 
    {
        dibujarMazo(canvas);
    } catch (Exception e) {}

    /* Repartiendo o robando*/
    try 
    {
        dibujarAnimacionRobarRepartir(canvas);
    } catch (Exception e) {}

}

@SuppressLint("WrongCall")
@Override
public void run() 
{
    while (true)
    {
        // Dibujar
        if (!holder.getSurface().isValid())continue;
        if (!isItOk) continue;
        Canvas c = holder.lockCanvas();
        synchronized (holder) {
            onDraw(c);
        }
        holder.unlockCanvasAndPost(c);

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

public void pause ()
{
    //isItOk = false;
}

public void resume ()
{
    //isItOk = true;
}

}

如果要在SurfaceView的Surface上绘制,请不要重写onDraw()

SurfaceViews有两个部分,Surface和View。 View部分的工作方式与View类的其他任何成员一样,遵循通常的无效/重绘序列。 通常,SurfaceView的“视图”是一个透明孔,布局代码使用该孔为Surface透出空隙。

Surface是一个完全独立的图层,默认情况下它位于View图层的后面,但可以配置为位于最上面。 它会忽略无效/刷新,并在您对其进行解锁时进行更新(或者,如果您使用的是GLES,则交换EGL缓冲区)。 因为没有与View UI的交互,所以您可以从专用渲染器线程更新Surface。

您正在将两者混合在一起。 您已经覆盖了onDraw() ,就像在创建自定义View一样 ,但是您也使用相同的功能渲染到Surafce上。

onDraw()重命名为doDraw()并删除覆盖。 或者,从SurfaceView切换到普通的自定义视图,然后使用postInvalidate()驱动更新。

画布在SurfaceView曲面上的渲染不是硬件加速的,而是在自定义View上的Canvas绘图的。 根据设备和要触摸的像素数,使用自定义视图可能会更快。

您也可以通过使用较小的Surface并让硬件对其进行缩放来加快Surface渲染速度。 演示博客文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM