当您SurfaceView
在 Android 中使用 s 时,尤其是在将它们设置为布局的一部分时(通过将 s 添加SurfaceView
到布局 XML 中),性能是一个至关重要的方面。
就我而言,它View
每隔几秒更新一次(包含扑克游戏中的扑克牌,具有一些效果和触摸事件的移动),并且由于它是更大布局的一部分,我遇到的问题是这SurfaceView
会减慢其余部分我Activity
的用户界面,即其余的Activity
冻结一小段时间,然后它被更新,因此没有显示一小段时间。
public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
...
}
在其onDraw()
方法中,有一些Bitmap
s 被绘制到黑色背景上。在该类内部,启动了一个线程,该线程不断调用View
'sonDraw()
方法:
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
andinvalidate()
每次调用onTouchEvent()
,但这也不起作用。
我认为必须有一种方法来提高性能,因为它SurfaceView
的更新频率很低。有几秒钟没有任何反应,但是当用户触摸 时View
,东西会四处移动,直到手指抬起。