2013-08-04 89 views
0

使用Android和OpenGL我調用drawFrame(GL10 gl)方法,該方法在系統準備好渲染另一個幀時繪製。控制渲染的OpenGL drawFrame方法嗎?

在一個單獨的遊戲循環線程中,我控制着更新和碰撞檢測測試。

我有一個攝像頭跟着一個與地面靜止的物體。物體被加速力拉下,但物體檢測到它與地面的碰撞,並將其自身放回到應有的位置。

因爲我有兩個線程,當模擬只是坐在那裏時,有時渲染線程會在碰撞檢測系統有時間重新定位對象之前,將對象拉到地面下方時繪製對象。其結果是偶爾在隨機時間上下晃動的相機。

我讀過,你可以控制何時調用drawFrame方法,這將解決我的問題,但我聽說你不應該那樣做。爲什麼我不應該那樣做以及如何解決我的問題?

+0

我相信這個問題歸結爲確保兩個線程不會同時執行。我寧願控制它。 – Matthew

回答

0

在完成所有更新(物理&碰撞)之前,您希望避免渲染線程'偷偷摸摸'。這應該通過使用synchronized來解決。

但是,如果你鎖定整個事情,你有更新線程等待所有渲染完成,反之亦然,這不是一個好主意。因此,我建議讓你的渲染線程使用的變量的「副本」。 在某些情況下(例如,當您更新頂點位置時),這些副本隱含在GPU上。在其他情況下(例如您的相機位置),您必須明確定義它們。

爲了說明我的意思:

update() { 
    synchronized(lock) { 
    doPhysics() 
    doCollision() 
    } 
} 

draw(GL gl) { 
    synchronized(lock) { 
    transferToGLVariables() 
    } 
    render(gl)  
} 

這樣你就不必控制在渲染線程渲染可言,我相信這是一個更可靠的方法。