2013-01-23 139 views
0

当您在Android中使用SurfaceView时,尤其是将它们设置为布局的一部分时(通过将SurfaceView添加到布局XML中),性能是至关重要的一个方面。加速Android中的SurfaceView,每隔几秒只更新一次

就我而言,View仅每隔几秒更新一次(包含扑克游戏中的扑克牌,有一些效果和触摸事件),并且由于它是较大布局的一部分,因此我遇到了以下问题这SurfaceView减慢我的Activity的用户界面的其余部分,即其余的Activity冻结一段时间,然后它被更新,以便短时间没有显示。

public class MySurface extends SurfaceView implements SurfaceHolder.Callback { 
    ... 
} 

在其onDraw()方法,有吸引到黑色背景一些Bitmap秒。里面那类,一个线程开始连续调用ViewonDraw()方法:

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class SurfaceThread extends Thread { 

    private SurfaceHolder mSurfaceHolder; 
    private MySurface mSurface; 
    private boolean mRunning = false; 

    public HandThread(SurfaceHolder surfaceHolder, MySurface surface) { 
     mSurfaceHolder = surfaceHolder; 
     mSurface = surface; 
    } 

    public SurfaceHolder getSurfaceHolder() { 
     return mSurfaceHolder; 
    } 

    public void setRunning(boolean run) { 
     mRunning = run; 
    } 

    @Override 
    public void run() { 
     Canvas c; 
     while (mRunning) { 
      c = null; 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) { 
        if (c != null) { 
         mSurface.onDraw(c); 
        } 
       } 
      } 
      finally { // when exception is thrown above we may not leave the surface in an inconsistent state 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 

} 

不幸的是,这会减慢我的Activity不时,这意味着有大约冻结的0.5秒经常。

有没有可能加快速度?我试图放弃Thread,并在每次拨打onTouchEvent()时致电invalidate(),但这也不起作用。

我认为必须有一种方法来提高性能,因为SurfaceView不经常更新。有几秒钟什么也没有发生,但当用户触摸View时,事物一直在四处移动,直到手指抬起。

回答

1

你会想分析真正导致这些暂停的东西。 Trace through一个典型的运行,看看实际使用的CPU时间。有可能,有些东西导致UI冻结,你正在做很多工作,应该是moved to another thread

你也想避免不必要的工作。你绝对想看的东西是确保在你的后台循环中(包括调用onDraw)避免尽可能创建新的对象。这将减少垃圾收集,也可能导致打嗝。如果可能的话,也尽量避免或最小化加载位图。

+0

非常感谢!首先从UI线程调用onDraw()?因为在随后的调用中,我从另一个线程(手动)调用它,但在我看来,好像第一个调用是由UI在UI线程上完成的。 – caw

相关问题