在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
时,事情就会移动,直到手指抬起。
答案 0 :(得分:1)
您需要分析导致这些暂停的原因。 Trace through典型的运行,看看实际耗尽CPU时间的是什么。有可能导致用户界面冻结,你正在做很多应该moved to another thread的工作。
您还希望避免不必要的工作。你肯定想要看的是确保在后台循环(包括调用onDraw
)中尽可能避免创建新对象。这将减少垃圾收集,这也可能导致打嗝。如果可能的话,也要避免或最小化加载位图。