SurfaceView
을 Android에서 사용하는 경우, 특히 레이아웃 XML에 SurfaceView
을 추가하여 레이아웃의 일부로 설정하는 경우 성능이 중요한 측면입니다.안드로이드에서 SurfaceView를 몇 초마다 한 번만 업데이트하십시오.
내 경우에, View
은 몇 초마다 한 번만 업데이트됩니다 (포커 게임과 같은 카드 놀이, 일부 효과 및 터치 이벤트로 이동). 더 큰 레이아웃의 일부이므로, 이 SurfaceView
은 내 Activity
의 UI의 나머지 부분을 느리게합니다. 즉, 잠시 동안 Activity
의 나머지 부분이 정지 한 다음 짧은 시간이 표시되지 않도록 업데이트됩니다. 그 방법에서 onDraw()
public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
...
}
, 검은 색으로 그려진 일부 Bitmap
S있다.
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
속도가 느려집니다, 약의 정지 있다는 것을 의미 : 그 클래스의 내부 스레드는 지속적으로 View
의 onDraw()
메소드를 호출 시작 0.5 초.
속도가 빨라질 가능성이 있습니까? 나는 Thread
을 포기하고 의 모든 전화에서 invalidate()
로 전화를 걸었지만 이것도 작동하지 않았습니다.
드물게 업데이트되는 SurfaceView
이 있기 때문에 성능을 향상시킬 방법이 있어야한다고 생각합니다. 아무 것도 일어나지 않는 초가 있지만 사용자가 View
을 터치하면 손가락이 위로 올라갈 때까지 물건들이 움직입니다.
대단히 감사합니다! UI 스레드에서'onDraw()'가 먼저 호출 되었습니까? 후속 호출에서는 (수동으로) 다른 스레드에서 호출하기 때문에, UI 스레드에서 Android가 첫 번째 호출을 수행 한 것처럼 보입니다. – caw