在Android应用中,cocos的渲染和js的逻辑是在gl线程中进行的,而android本身的UI更新是在app的UI线程进行的,所以如果我们在js中调用的Java方法有任何刷新UI的操作,都需要在UI线程进行。
如果画板的控件继承于View控件,进行绘画事件逻辑在gl线程上进行,然后在gl线程通过postInvalidate()函数将消息分发回UI线程调用ondraw()函数绘制图画,刷新屏幕。经测试postInvalidate()函数在处理gl线程与UI线程的消息传递时会造成卡顿。可以通过将画板的控件继承SurfaceView(专门处理绘制的控件,常常在游戏中被用到),获取画布然后在UI线程,绘制图画,刷新屏幕来解决卡顿问题。
SurfaceView可以通过获取SurfaceHolder来取得对canvas的控制,对画板进行绘制,而不用通过postInvalidate()来调用onDraw()函数,这之间跳过了postInvalidate()的环节,成功解决的卡顿的问题。