안드로이드 Surface View

2013. 12. 30. 21:15Programing/Android / Java

1.  Surface View

애플리케이션에 있는 뷰들은 GUI 스레드 상에서 그려지는데 요녀석이 백그라운드에서는 돌지 않는다. 그래서 다시 애플리케이션이 활성화 되거나 어떤 이벤트 동작을 받았을 경우에 새로 그려지게 되는데 처리량이 많은 경우 이렇게 되버리면 눈앞에서 변경되는 모습이 나타나 버벅거림으로 보이게 된다.


여기까지만 보면 더블버퍼링이 생각나시는 분들이 상당 수 이실텐데 바로 그것이 서페이스 뷰(Surface View)다. 


Surface의 사전적 용어처럼 액티비티의 내용을 항상 Surface에 그려주고 이 Surface를 화면에 뿌려주게된다. 즉 더블 버퍼링의 메모리에 해당하는 부분이 Surface인 것이다. Surface 는 백그라운드에서도 지속적으로 작업을 하고 있기 때문에 속도도 빠르다고 볼 수 있다.


3D 가속 처리, 카메라, 게임 같은 지속적인 Draw가 필요한 경우에는 이런 Surface View를 사용하는 것이 좋다.

일반 GUI 스레드 상에서 3D 처리를 하게 되면 5~7프레임 정도만 나오지만 Surface View로 전환하면 30~40프레임도 나온다니 어떤 것이 효율적인 개발인지 알 것이다. 물론 나는 3D를 아직 해보지 않았으니 잘 모르지만...정리하면서 검색한 결과에 따르면 그렇다고 한다.


자세한 설명은 이쪽(http://sozu.tistory.com/35)으로 가시길.



2. Surface View 소스 분석

메인 액티비티는 그대로 둔 상태에서 SurfaceView를 상속 받는 하나의 클래스를 생성한다. 이때 implements로 Surfaceholder를 받는다.  해서 실제로 만들어진 MySurfaceView는 다음과 같은 형태를 띈다. 


여기서 SurfaceHolder는 Surface를 담고 있는 중요한 역할을 담당한다. 이를 통해 SurfaceView는 생성, 소멸, 변경 될 때마다 View에 이러한 상황을 SurfaceHolder에 담아 전달하게 된다.


public class MySurfaceView implements SurfaceHolder.Callback {

  

    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width,

            int height) {

        // TODO Auto-generated method stub

          

    }

  

    @Override

    public void surfaceCreated(SurfaceHolder holder) {

        // TODO Auto-generated method stub

          

    }

  

    @Override

    public void surfaceDestroyed(SurfaceHolder holder) {

        // TODO Auto-generated method stub

          

    }

}



- SurfaceHolder의 디자인 패턴

현재 SurfaceHolder의 레퍼런스를 받아 이를 독립적으로 업데이트 하는 Thread 파생 클래스를 갖는다. 

파생된 Thread 클래스는 Surface View 컨트롤 내에 생성된다.

모든 UI 업데이트는 이 새로운 클래스 내에서 처리된다.


class MySurfaceThread extends Thread {

          

        MySurfaceThread()

        {

            super();

        }

          

        @Override

        public void run() {

              

        }

          

        public void requestExitAndWait() {

              

        }

          

        public void onWindowResize(int w, int h)

        {

              

        }

    }


Thread 삽입까지 끝났다면 이제 입맛대로 Surface Viewd에 이미지를 그리면 된다. Canvas를 이용한 이미지 출력은 각자의 몫으로 남기도록 하겠다.

 


출처 : http://starkapin.tistory.com/131