2012-03-27 3 views
0

나는 SurfaceView과 그 사용법을 읽었으며, SurfaceView에는 View#willNotDraw()이 기본적으로 false로 설정되어 있으며 SurfaceView#onDraw()에 전화를 걸었습니다. RomainGuy는 이것이 더 효율적이기 때문에 기본적으로이 작업이 완료되었다고 말했습니다. 내 질문은 이제 언제 SurfaceView#onDraw()을 별도의 스레드에서 호출해야하는지, View#willNotDraw()true으로 설정하고 SurfaceView#invalidate()으로 전화하면됩니까? 둘 사이에는 차이점이 있습니까? 그리고 성능이 다른 것보다 더 향상됩니까?SurfaceView를 언제 UI 스레드로 그려야합니까?

답변

1

참조 :

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

당신이 정보를 어디서 얻었는지 잘 모르겠지만, 적어도 javadoc에서는 대부분의 사용자가 안드로이드는 그것을 onDraw 이벤트 자체를 보낼 얻을 false로 설정 것이라고 말했다. 이 작업을 수행해야하는시기에 관한 질문에 대해서는 SurfaceView을 사용하는 이유가 무엇인지에 관해 설명 할 것입니다.

보기가 동적 인 경우 (예 : 게임이나 이벤트 루프가 빡빡한 게임의 경우) 업데이트가 발생하면 정확하게 제어하고 싶을 것입니다. 특히 invalidate의 자세한 양식은 전체 View을 다시 그릴 저장합니다. Android가 invalidate에 전화하는 것을 원하지 않을 것이므로 그 이유가 여기에 있습니다.

반면에 단순히 정적 인 것을 그리는 경우 Android의 UI 스택이 무효화를 제어하도록하는 것이 좋습니다. 그런데

, invalidateView을 다시 그릴 요청을 게시, 그래서 당신이 이벤트 루프 스타일을 사용하려는 경우이 인식 ( onDraw은 언젠가 당신이 전화 후 호출됩니다).

편집 : 몇 가지 설명.

1

SurfaceView.onDraw() 및 SurfaceView.invalidate()를 사용하면 SurfaceView가 일반 View처럼 동작하고 SurfaceView와 관련된 추가 오버 헤드를 지불하게됩니다. UI 스레드에서 그리려면 일반보기를 대신 사용하십시오. 더 쉽고 저렴합니다.

관련 문제