SurfaceView와 View의 차이점은 무엇입니까?


211

언제 필요 합니까? 또는 SurfaceView대신 View? 를 사용하는 것이 좋습니다 .

답변:


210

뷰는 모두 동일한 GUI 스레드에서 그려지며 모든 사용자 상호 작용에도 사용됩니다.

따라서 GUI를 빠르게 업데이트해야하거나 렌더링에 너무 많은 시간이 걸리고 사용자 경험에 영향을주는 경우를 사용하십시오 SurfaceView.


2
자세한 내용이 포함 된 피어스의 답변을 확인하십시오.
Helin Wang


더 이상 간단하지 않습니다. 피어서의 답변을 확인하십시오. 자세한 아키텍처 문서 ( source.android.com/devices/graphics/architecture.html )에 대한 링크가 있으며 Canvas 렌더링의 하드웨어 가속이 사용자 정의 뷰를 더 나은 선택으로 만드는 이유를 설명합니다.
fadden

1
SurfaceView 대신 FrameLayout을 사용하여 뷰를 스택 할 때?
IgorGanapolsky

103

내가 주목 한 몇 가지 :

  • SurfaceView에는 스레드가 핸들러를 사용하지 않고 표면의 내용을 업데이트 할 수있는 멋진 렌더링 메커니즘이 포함되어 있습니다 (애니메이션에 적합).
  • Surfaceview 투명 할 수 없으며 뷰 계층의 다른 요소 뒤에 만 나타날 수 있습니다.
  • 뷰에 렌더링하는 것보다 애니메이션 속도가 훨씬 빠릅니다.

자세한 정보 (및 훌륭한 사용 예)는 SDK 예제 섹션의 LunarLander 프로젝트를 참조하십시오.


36
참고로 SurfaceView는 이제 투명해질 수 있습니다 : stackoverflow.com/questions/5391089/…
Steve

@Ralphleon : Surface Views가 투명 할 수 없다는 것은 무엇을 의미합니까? 다른 뷰가 표면 뷰와 겹칠 수 있습니까? 예를 들어 Surface보기에 ListView를 임시로 표시 할 수 있습니까?
Ashwin

78

2014 년 5 월 9 일 업데이트

확인. 우리가 지금은 공식 문서를. 그것은 내가 언급 한 모든 것을 더 나은 방식으로 이야기했다.


자세한 내용은 여기를 참조 하십시오 .

예, 주요 차이점은 백그라운드 스레드에서 surfaceView를 업데이트 할 수 있다는 것입니다. 그러나 더 많은 관심이 있습니다.

  • surfaceView는 표면 버퍼 전용이며 모든 뷰는 ViewRoot에 의해 할당 된 하나의 표면 버퍼를 공유합니다. 다시 말해 surfaceView는 더 많은 리소스를 소비합니다.

  • JB4.2부터는 SurfaceView를 하드웨어 가속 할 수 없지만 openGL ES를 사용하여 일반 View에서 95 % 작업이 HW 가속화됩니다.

  • 사용자 정의 된 surfaceView를 만들려면 더 많은 작업을 수행해야합니다. surfaceCreated / Destroy 이벤트를 수신하고 렌더 스레드를 생성하는 것이 중요하며 렌더 스레드와 메인 스레드를 동기화해야합니다. 그러나보기를 사용자 정의하려면 재정의 onDraw메소드 만 수행하면 됩니다.

  • 업데이트 타이밍이 다릅니다. 일반 뷰 업데이트 메커니즘은 프레임 워크에 의해 제한되거나 제어됩니다. view.invalidateUI 스레드 또는 view.postInvalid다른 스레드에서 뷰를 업데이트해야한다는 것을 프레임 워크에 표시하기 위해 호출 합니다. 그러나보기는 즉시 업데이트되지 않지만 다음 VSYNC 이벤트가 도착할 때까지 기다리십시오. VSYNC를 이해하는 쉬운 방법은 60fps 화면에서 16ms마다 실행되는 타이머라고 생각하는 것입니다. Android에서는 모든 일반보기 업데이트 (및 실제로 표시하지만 오늘 이야기하지는 않음)는 VSYNC와 동기화되어 더 매끄 럽습니다. 이제 surfaceView로 돌아가서 언제든지 원하는대로 렌더링 할 수 있습니다. 그러나 앞에서 설명한 것처럼 디스플레이가 VSYNC와 동기화되기 때문에 이점이 있는지 알 수 없습니다.

2
귀하의 답변에서 SurfaceView보다 View에서 파생 된 클래스를 사용하는 것이 좋습니다. 아니면 뭔가 잘못되고 있습니까? 이것은 대부분의 2D 게임 개발 튜토리얼과 반대됩니다.
Storm

2
@Storm은 설계 상 SurfaceView가 UI 스레드로만보기를 수정할 수있는 UI 스레드를 차단해서는 안된다는 점을 고려해야합니다. 대부분의 게임에서 SurfaceViews는 간단한 렌더링으로 UI 스레드를 차단하는 적절한 렌더링을 수행합니다. 이것이 SurfaceView의 주요 이점입니다.
zgc7009 2019

당신은 무엇을 의미합니까 렌더링 스레드를 생성 . 매번 수동으로 만들어야합니까?
IgorGanapolsky

44

주요 차이점은 SurfaceView배경 theads로 그릴 수 는 있지만 Views불가능합니다. SurfaceViews더 많은 리소스를 사용하므로 필요한 경우가 아니라면 사용하고 싶지 않습니다.


"그들은 더 많은 리소스를 사용하기 때문에 필요한 경우가 아니라면 사용하고 싶지 않습니다." -누가 더 많은 리소스를 사용합니까? 뷰 또는 SurfaceView?
Dror

6
Surfaceview는 조회수보다 많은 리소스를 사용합니다
Ritesh Gune

1
@RiteshGune 얼마나?
Alex Sifuentes

우리 언제해야 합니까?
IgorGanapolsky

12

A SurfaceView는 Android에서 사용자 정의보기로 사용할 수 있습니다.

a View와 a 의 주요 차이점은에서 모든 사용자 상호 작용에 사용되는 SurfaceView보기가 뷰에 그려져 UI Thread있다는 것입니다.

UI를 충분히 빠르게 업데이트하고 많은 양의 정보를 렌더링하려면 SurfaceView가 더 좋습니다.

그러나 몇 가지 기술적 인 내용이 있습니다 SurfaceView.

1. 하드웨어 가속이 아닙니다.

2. 당신이 방법을 호출 할 때 일반 뷰를 렌더링 invalidate하거나 postInvalidate(),하지만이보기가 즉시 업데이트됩니다 의미하지 않는다 (A가 VSYNC전송되며,이 업데이트되는 때 OS가 결정한다. (가) SurfaceView바로 업데이트 할 수 있습니다.

3. 서피스 뷰 SurfaceView가있다 할당 surface buffer되어 있으므로 비용이 많이 듭니다.


하드웨어 가속 이 중요한 이유는 무엇 입니까?
IgorGanapolsky

8

surfaceview와 view의 주요 차이점 중 하나는 일반 뷰의 화면을 새로 고치려면 뷰가 정의 된 동일한 스레드에서 invalidate 메서드를 호출해야한다는 것입니다. 그러나 무효화라고 부르더라도 새로 고침은 즉시 수행되지 않습니다. VSYNC 신호가 다음에 도착한 후에 만 ​​발생합니다. VSYNC 신호는 16.6ms마다 발생하는 커널 생성 신호이거나 초당 60 프레임이라고도합니다. 따라서 화면 새로 고침 (예 : 매우 빠르게 움직이는 애니메이션)을보다 세밀하게 제어하려면 일반 뷰 클래스를 사용하지 않아야합니다.

반면에 surfaceview의 경우 원하는 속도로 화면을 새로 고칠 수 있으며 백그라운드 스레드에서 수행 할 수 있습니다. 따라서 표면 뷰를 새로 고치는 것은 실제로 VSYNC에 의존하지 않으며 고속 애니메이션을 원할 때 매우 유용합니다. 나는이 모든 것들을 잘 설명하는 훈련 비디오와 예제 응용 프로그램이 거의 없습니다. 다음 교육 비디오를보십시오.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

클래식 View 클래스가 아닌 SurfaceView를 사용해야하는 이유 ...

주된 이유 중 하나는 SurfaceView가 화면을 빠르게 렌더링 할 수 있기 때문입니다.

간단히 말해서 SV는 타이밍 및 렌더링 애니메이션을보다 잘 관리 할 수 ​​있습니다.

SurfaceView가 무엇인지 더 잘 이해하려면 View 클래스와 비교해야합니다.

차이점은 ... 비디오에서이 간단한 설명을 확인하십시오.

https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30

뷰와 관련하여 한 가지 큰 문제가 있습니다. 애니메이션 렌더링 타이밍입니다.

일반적으로 onDraw ()는 Android 런타임 시스템에서 호출됩니다.

따라서 Android 런타임 시스템이 onDraw ()를 호출하면 응용 프로그램이 제어 할 수 없습니다

표시 타이밍이며 애니메이션에 중요합니다. 타이밍 차이가있다

응용 프로그램 (우리 게임)과 Android 런타임 시스템 사이.

SV는 전용 Thread에 의해 onDraw ()를 호출 할 수 있습니다.

따라서 응용 프로그램이 타이밍을 제어합니다. 따라서 애니메이션의 다음 비트 맵 이미지를 표시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.