我正在嘗試使用OpenGL ES爲Android編寫一個小型遊戲引擎。我創建了一個Game Thread來更新遊戲對象和GLThread來繪製場景。我讀過你需要在GLSurfaceView的onSurfaceCreated方法中加載紋理。我跟着,但爲了一些調試目的,我試圖加載我的遊戲線程,而不是GLThread的紋理。我沒有任何錯誤,紋理沒有顯示在屏幕上。我花了整整一天的時間試圖找出問題,最後我看了下面的內容here爲什麼不能從另一個線程調用OpenGL ES函數
「只要確保在主線程中只使用OpenGL。」很重要。您不能在您的遊戲引擎(可能位於另一個線程中)調用與gl線程不同步的紋理加載函數。設置一個標誌來指示你的gl線程加載一個新紋理(例如,你可以在OnDrawFrame(GL gl)中放置一個函數來檢查是否必須加載一個新的紋理。所以紋理將被加載從GL線程我只是不明白爲什麼是這樣的爲什麼OpenGL函數不能從另一個線程工作
我知道如何創建線程,但我不知道是什麼同步手段上面的提取提到:「你不能在你的遊戲引擎(可能在另一個線程中)調用一個與gl線程不同步的紋理加載函數。」所以我猜我的遊戲線程可能不同步與GL線程是否可以創建另一個與GL線程同步的線程所以可以從它調用GL函數?我應該通過線程學到什麼來理解這些概念?
我不是Android的傢伙,但在iOS中有類似警告的兩個原因:其一是當前GL上下文是線程特定的,所以您需要跨上下文線程傳遞上下文貨幣,第二個(更多重要的是)在沒有同步的情況下從多線程混淆GL狀態只會導致GL上下文狀態的破壞。 HTH。 –
我認爲這只是爲了避免同時訪問 –