【问题标题】:Why "SurfaceView" is slower than a custom "view"?为什么“SurfaceView”比自定义“视图”慢?
【发布时间】:2014-07-16 14:14:24
【问题描述】:

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

最初我使用自定义“视图”,但在处理不同分辨率设备的时间时遇到了问题。动画也不流畅。

阅读了一些示例和评论后,我决定使用“SurfaceView”。现在动画很流畅,但一切都比“视图”慢。我不知道为什么,因为从“View”迁移到“SurfaceView”时我几乎没有改变:

在“视图”中(+90 fps):

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

        updateSprites();

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

在“Surfaceview”中(“Lienzo”是主类)(可能是 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”是解决方案。

谢谢。

【问题讨论】:

  • Surfaceview 中是否有线程在运行您的可运行对象?
  • 不,它在一个单独的子类中。

标签: android view surfaceview


【解决方案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 的痛苦和挫败感。

【讨论】:

  • 画布渲染到 SurfaceView 不是硬件加速的,而画布渲染到普通视图是。 OTOH,您可以将 OpenGL ES 与 SurfaceView 一起使用。
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多