当您在Android中使用SurfaceView
时,尤其是将它们设置为布局的一部分时(通过将SurfaceView
添加到布局XML中),性能是至关重要的一个方面。加速Android中的SurfaceView,每隔几秒只更新一次
就我而言,View
仅每隔几秒更新一次(包含扑克游戏中的扑克牌,有一些效果和触摸事件),并且由于它是较大布局的一部分,因此我遇到了以下问题这SurfaceView
减慢我的Activity
的用户界面的其余部分,即其余的Activity
冻结一段时间,然后它被更新,以便短时间没有显示。
public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
...
}
在其onDraw()
方法,有吸引到黑色背景一些Bitmap
秒。里面那类,一个线程开始连续调用View
的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);
}
}
}
}
}
不幸的是,这会减慢我的Activity
不时,这意味着有大约冻结的0.5秒经常。
有没有可能加快速度?我试图放弃Thread
,并在每次拨打onTouchEvent()
时致电invalidate()
,但这也不起作用。
我认为必须有一种方法来提高性能,因为SurfaceView
不经常更新。有几秒钟什么也没有发生,但当用户触摸View
时,事物一直在四处移动,直到手指抬起。
非常感谢!首先从UI线程调用onDraw()?因为在随后的调用中,我从另一个线程(手动)调用它,但在我看来,好像第一个调用是由UI在UI线程上完成的。 – caw