Android 什么时候让UI线程绘制SurfaceView?

Android 什么时候让UI线程绘制SurfaceView?,android,surfaceview,android-custom-view,Android,Surfaceview,Android Custom View,我正在阅读SurfaceView以及如何使用它,我发现一些信息表明SurfaceView在默认情况下将View\willNotDraw()设置为false,并且由您调用SurfaceView\onDraw()。我还读到Rominguy说这是默认的,因为它更有效。我现在的问题是,什么时候应该在单独的线程中处理调用SurfaceView#onDraw(),什么时候应该将View#willNotDraw()设置为true,然后只调用SurfaceView#invalidate()。两者之间是否存在差异

我正在阅读
SurfaceView
以及如何使用它,我发现一些信息表明
SurfaceView
在默认情况下将
View\willNotDraw()
设置为false,并且由您调用
SurfaceView\onDraw()
。我还读到Rominguy说这是默认的,因为它更有效。我现在的问题是,什么时候应该在单独的线程中处理调用
SurfaceView#onDraw()
,什么时候应该将
View#willNotDraw()
设置为
true
,然后只调用
SurfaceView#invalidate()
。两者之间是否存在差异,一个是否比另一个更能提高性能?

请参阅:

我不知道你是从哪里得到信息的,但至少javadoc说大多数用户会将此设置为
false
,让Android发送
onDraw
事件本身。至于你关于什么时候应该这样做的问题,我想说的是你为什么要使用
SurfaceView

如果您的视图显示的是动态的内容(例如,对于游戏或具有紧密事件循环的内容),则您需要精确控制更新发生的时间,尤其是如果您有信息可以使用更详细的
invalidate
格式之一保存整个
视图的重画。你不会希望Android为你调用
invalidate
,这就是为什么会有这个标志

另一方面,如果你只是简单地画一些静态的东西,那么让Android的UI堆栈控制失效是有意义的

顺便说一句,
invalidate
仅发布重新绘制
视图的请求,因此如果要使用事件循环样式,请注意这一点(
onDraw
将在调用后的某个时间调用)

编辑:一些澄清。

使用SurfaceView.onDraw()和SurfaceView.invalidate()将使SurfaceView的行为类似于普通视图,您将支付与SurfaceView相关的额外开销。如果要从UI线程绘制,请改用常规视图。它更容易,也更便宜