加速Android中的SurfaceView,每隔几秒钟更新一次

时间:2013-01-23 00:45:40

标签: android 2d surfaceview

在Android中使用SurfaceView时,尤其是在将其设置为布局的一部分时(通过将SurfaceView添加到布局XML中),性能是一个至关重要的方面。

在我的情况下,View每隔几秒钟更新一次(包含像扑克游戏中的扑克牌,有一些效果和移动触摸事件),因为它是更大布局的一部分,我体验问题SurfaceView减慢了Activity用户界面的其余部分,即Activity的其余部分在短时间内冻结,然后更新,以便短时间内时间尚未显示。

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

onDraw()方法中,有一些Bitmap被绘制为黑色背景。在该类的内部,启动了一个不断调用View的{​​{1}}方法的线程:

onDraw()

不幸的是,这会不时减慢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); } } } } } 的速度,这意味着会冻结ca.经常0.5秒。

有没有可能加快速度?我试图放弃Activity并在Thread的每次通话中拨打invalidate(),但这也不起作用。

我认为必须有一种提高性能的方法,因为onTouchEvent()不经常更新。有几秒没有发生任何事情,但当用户触摸SurfaceView时,事情就会移动,直到手指抬起。

1 个答案:

答案 0 :(得分:1)

您需要分析导致这些暂停的原因。 Trace through典型的运行,看看实际耗尽CPU时间的是什么。有可能导致用户界面冻结,你正在做很多应该moved to another thread的工作。

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