답변:
뷰는 모두 동일한 GUI 스레드에서 그려지며 모든 사용자 상호 작용에도 사용됩니다.
따라서 GUI를 빠르게 업데이트해야하거나 렌더링에 너무 많은 시간이 걸리고 사용자 경험에 영향을주는 경우를 사용하십시오 SurfaceView
.
내가 주목 한 몇 가지 :
자세한 정보 (및 훌륭한 사용 예)는 SDK 예제 섹션의 LunarLander 프로젝트를 참조하십시오.
2014 년 5 월 9 일 업데이트
확인. 우리가 지금은 공식 문서를. 그것은 내가 언급 한 모든 것을 더 나은 방식으로 이야기했다.
예, 주요 차이점은 백그라운드 스레드에서 surfaceView를 업데이트 할 수 있다는 것입니다. 그러나 더 많은 관심이 있습니다.
surfaceView는 표면 버퍼 전용이며 모든 뷰는 ViewRoot에 의해 할당 된 하나의 표면 버퍼를 공유합니다. 다시 말해 surfaceView는 더 많은 리소스를 소비합니다.
JB4.2부터는 SurfaceView를 하드웨어 가속 할 수 없지만 openGL ES를 사용하여 일반 View에서 95 % 작업이 HW 가속화됩니다.
사용자 정의 된 surfaceView를 만들려면 더 많은 작업을 수행해야합니다. surfaceCreated / Destroy 이벤트를 수신하고 렌더 스레드를 생성하는 것이 중요하며 렌더 스레드와 메인 스레드를 동기화해야합니다. 그러나보기를 사용자 정의하려면 재정의 onDraw
메소드 만 수행하면 됩니다.
view.invalidate
UI 스레드 또는 view.postInvalid
다른 스레드에서 뷰를 업데이트해야한다는 것을 프레임 워크에 표시하기 위해 호출 합니다. 그러나보기는 즉시 업데이트되지 않지만 다음 VSYNC 이벤트가 도착할 때까지 기다리십시오. VSYNC를 이해하는 쉬운 방법은 60fps 화면에서 16ms마다 실행되는 타이머라고 생각하는 것입니다. Android에서는 모든 일반보기 업데이트 (및 실제로 표시하지만 오늘 이야기하지는 않음)는 VSYNC와 동기화되어 더 매끄 럽습니다. 이제 surfaceView로 돌아가서 언제든지 원하는대로 렌더링 할 수 있습니다. 그러나 앞에서 설명한 것처럼 디스플레이가 VSYNC와 동기화되기 때문에 이점이 있는지 알 수 없습니다.주요 차이점은 SurfaceView
배경 theads로 그릴 수 는 있지만 Views
불가능합니다.
SurfaceViews
더 많은 리소스를 사용하므로 필요한 경우가 아니라면 사용하고 싶지 않습니다.
A SurfaceView
는 Android에서 사용자 정의보기로 사용할 수 있습니다.
a View
와 a 의 주요 차이점은에서 모든 사용자 상호 작용에 사용되는 SurfaceView
보기가 뷰에 그려져
UI Thread
있다는 것입니다.
UI를 충분히 빠르게 업데이트하고 많은 양의 정보를 렌더링하려면 SurfaceView가 더 좋습니다.
그러나 몇 가지 기술적 인 내용이 있습니다 SurfaceView
.
1. 하드웨어 가속이 아닙니다.
2. 당신이 방법을 호출 할 때 일반 뷰를 렌더링 invalidate
하거나 postInvalidate()
,하지만이보기가 즉시 업데이트됩니다 의미하지 않는다 (A가 VSYNC
전송되며,이 업데이트되는 때 OS가 결정한다. (가) SurfaceView
바로 업데이트 할 수 있습니다.
3. 서피스 뷰 SurfaceView가있다 할당 surface buffer
되어 있으므로 비용이 많이 듭니다.
surfaceview와 view의 주요 차이점 중 하나는 일반 뷰의 화면을 새로 고치려면 뷰가 정의 된 동일한 스레드에서 invalidate 메서드를 호출해야한다는 것입니다. 그러나 무효화라고 부르더라도 새로 고침은 즉시 수행되지 않습니다. VSYNC 신호가 다음에 도착한 후에 만 발생합니다. VSYNC 신호는 16.6ms마다 발생하는 커널 생성 신호이거나 초당 60 프레임이라고도합니다. 따라서 화면 새로 고침 (예 : 매우 빠르게 움직이는 애니메이션)을보다 세밀하게 제어하려면 일반 뷰 클래스를 사용하지 않아야합니다.
반면에 surfaceview의 경우 원하는 속도로 화면을 새로 고칠 수 있으며 백그라운드 스레드에서 수행 할 수 있습니다. 따라서 표면 뷰를 새로 고치는 것은 실제로 VSYNC에 의존하지 않으며 고속 애니메이션을 원할 때 매우 유용합니다. 나는이 모든 것들을 잘 설명하는 훈련 비디오와 예제 응용 프로그램이 거의 없습니다. 다음 교육 비디오를보십시오.
클래식 View 클래스가 아닌 SurfaceView를 사용해야하는 이유 ...
주된 이유 중 하나는 SurfaceView가 화면을 빠르게 렌더링 할 수 있기 때문입니다.
간단히 말해서 SV는 타이밍 및 렌더링 애니메이션을보다 잘 관리 할 수 있습니다.
SurfaceView가 무엇인지 더 잘 이해하려면 View 클래스와 비교해야합니다.
차이점은 ... 비디오에서이 간단한 설명을 확인하십시오.
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
뷰와 관련하여 한 가지 큰 문제가 있습니다. 애니메이션 렌더링 타이밍입니다.
일반적으로 onDraw ()는 Android 런타임 시스템에서 호출됩니다.
따라서 Android 런타임 시스템이 onDraw ()를 호출하면 응용 프로그램이 제어 할 수 없습니다
표시 타이밍이며 애니메이션에 중요합니다. 타이밍 차이가있다
응용 프로그램 (우리 게임)과 Android 런타임 시스템 사이.
SV는 전용 Thread에 의해 onDraw ()를 호출 할 수 있습니다.
따라서 응용 프로그램이 타이밍을 제어합니다. 따라서 애니메이션의 다음 비트 맵 이미지를 표시 할 수 있습니다.