2013-04-05 135 views
0

您好Android開發人員,如何中斷GLSurfaceView渲染階段並開始新階段?

什麼是當模式等於「Render_when_dirty」時中斷GLSurfaceView的當前渲染階段並開始一個新的最佳方式?我在「onDraw」方法中人工停止渲染,方法是檢查一個標誌並從「onDraw」方法中調用的實際渲染方法返回;然後,在主線程的上下文中,我調用「requestRender()」來刷新場景。但是,由於我沒有意識到的原因,一些中間舊框架會在非常短的時間內顯示(另一方面,它們會持續很長一段時間以致用戶可以實現轉換) ;在實際場景由opengl es 2.x引擎渲染之前。它根本不影響任何東西;但麻煩固定。你有什麼建議?

P.S.由於GLSurfaveView的實際渲染線程的破壞,在onDraw方法中拋出InterruptedException是無用的。

親切的問候。

+0

救助的'不建議onDraw'。當你有新的東西繪製時,最好是'requestRender',然後提交實際繪製'onDraw'中的內容。 – fadden 2013-04-18 00:16:15

回答

0

當你說一些舊的框架被繪製 - 你的意思是繪製框架的一部分是舊的或onDraw()的多個調用仍然導致一些舊信息顯示在顯示器上。

有幾件事情,我可以看到發生在這裏。如果你有一個的onDraw()這樣的:

onDrawFrame(){ 
    ... stuff ... 
    if (stateVariableSet) 
    return; 
    ... stuff ... 

我的理解是,當該功能完成正在運行,即正面/背面緩衝區被換和繪製。這裏可能發生的一件事情是,當您嘗試更新狀態/狀態變量時,會看到一些onDrawFrame()調用正在呈現。

在另一方面,如果你有這樣的事情:

onDrawFrame(){ 
    ... stuff.. 
    semaphore.acquire(); // lock the thread waiting for the state to update 
    ... stuff ... 

則已經繪製之前,鎖將過時的東西(該幀只,但 - 至少這就是我想要預料)。

也是你多核系統上運行?