2013-01-23 2 views
0

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 속도가 느려집니다, 약의 정지 있다는 것을 의미 : 그 클래스의 내부 스레드는 지속적으로 ViewonDraw() 메소드를 호출 시작 0.5 초.

속도가 빨라질 가능성이 있습니까? 나는 Thread을 포기하고 의 모든 전화에서 invalidate()로 전화를 걸었지만 이것도 작동하지 않았습니다.

드물게 업데이트되는 SurfaceView이 있기 때문에 성능을 향상시킬 방법이 있어야한다고 생각합니다. 아무 것도 일어나지 않는 초가 있지만 사용자가 View을 터치하면 손가락이 위로 올라갈 때까지 물건들이 움직입니다.

답변

1

정말 그 일시 중지를 일으키는 원인을 분석하고 싶을 것입니다. Trace through 일반적인 실행과 실제로 CPU 시간을 사용하는 것을보십시오. UI가 얼어 붙을 가능성이 있으며, moved to another thread 일을 많이 수행하고 있습니다.

불필요한 작업을 피하고 싶을 수도 있습니다. 당신이 확실히보고 싶은 것은 배경 루프 (onDraw에 대한 호출을 포함하여)에서 가능한 한 새로운 객체를 만드는 것을 피하는 것입니다. 이렇게하면 딸꾹질이 발생할 수있는 가비지 수집이 줄어 듭니다. 또한 가능하다면 비트 맵을 로딩하지 않거나 최소화하십시오.

+0

대단히 감사합니다! UI 스레드에서'onDraw()'가 먼저 호출 되었습니까? 후속 호출에서는 (수동으로) 다른 스레드에서 호출하기 때문에, UI 스레드에서 Android가 첫 번째 호출을 수행 한 것처럼 보입니다. – caw

관련 문제