OpenGL中的線程問題

用OpenGL做交互的時候,總需要處理點擊事件吧。結果今天在處理點擊事件的時候,遇到一個問題。當點擊事件觸發openGL的函數時返回的handle都是0。原以爲資源沒有釋放,但是改變代碼結構之後發現不是這個問題。仔細看log後發現了一句話:

call to OpenGL ES API with no current context (logged once per thread)

上網查查原因,說由於OpenGL是基於狀態的,所以會爲每個線程準備私有線程數據。所以新起一個線程來操作這個狀態機當然就會有問題了。我怎麼會新起一個線程呢?不都是UI線程在做這件事嗎?錯了。在使用GLSurfaceView的時候,Renderer裏面都是在新線程裏做的,目的是不耽誤主線程辦正事。所以,點擊事件是UI線程發的,自然是另一個線程操作OpenGL。驗證一下,在代碼中打印調用OpenGL的線程號,結果初始化時是23396,點擊事件觸發的是1。找到問題了吧。

怎麼解決?開始想在Renderer中寫handler,可是系統說no。一時犯傻啊,既然系統設計了線程隔離機制,一定也會提供線程通信的方法嘍!如下:

GLSurfaceView.queueEvent(Runnable r);

在點擊的時候,操作放在Runnable中,就好啦~~

問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章