當您在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