为什么" SurfaceView"比定制"视图"?慢

时间:2014-05-27 15:23:03

标签: android view surfaceview

我正在开发一个几乎完成的应用程序。但是我对图形有一些问题:

最初我使用了自定义" View",但在处理不同设备分辨率的时间方面遇到了麻烦。动画也不流畅。

所以在阅读一些例子和评论后,我决定使用" SurfaceView"。现在动画很流畅,但一切都比使用" View"慢。我不知道为什么,因为我从" View"迁移时没有任何改变。到" SurfaceView":

In" View" (+90 fps):

@Override
public void run(){      
    for(;;){
        if(gameState == PLAYING)
            updatePhisic();                             

        updateSprites();

        this.postInvalidate();
        try{
            Thread.sleep(10);
        }catch(InterruptedException e){}
    }
}

In" Surfaceview" (" Lienzo"是主要类<" Surfaceview">)(也许是30 fps)。

@Override
public void run() {
    Canvas canvas;
while(running){
    canvas = null;
    try{
    canvas = holder.lockCanvas(null);
    synchronized(holder){
        lienzo.updatePhisic();
        lienzo.draw(canvas);
    }
    }
        finally{    
        if(canvas != null)
        holder.unlockCanvasAndPost(canvas);
    }
}
}

物理和图形绘制在两种情况下都是相同的。

为什么?,我的意思是," SurfaceView"是所有事物的明显解决方案,现在" OpenGL"是解决方案。

感谢。

1 个答案:

答案 0 :(得分:1)

在将应用程序从使用SurfaceView切换到单个View子类时,我也经历了显着的FPS增长。我的信念是,这是由于硬件加速。

自从在Android 4.3中引入了SurfaceView的严重错误以来,我不得不切换SurfaceView。见https://code.google.com/p/android/issues/detail?id=58385。在Android开发者邮件列表上讨论这个问题时,Romain Guy实际上建议,由于硬件加速,使用普通View可能会更快。结果证明这是真的 - 至少在我开发的设备上(HTC One X和旧的Nexus 7)。然而,这可能是真的,图形更容易受到“不稳定”的影响。动画。对我来说,这个FPS的增加使我不得不处理SurfaceView错误并重构我的应用程序而不使用SurfaceView的初期痛苦和沮丧变得更加甜蜜。