2013-06-12 46 views
0

我想使用Android和OpenGL 2.0來創建一種沙漠賽車遊戲。至少這是最終目標。目前我真的只是通過使用Perlin噪聲算法來生成無盡的沙漠。但是,我遇到了許多關於併發和同步的問題。該程序由三個線程組成:一個「渲染」線程,一個「幾何」線程,它基本上位於後臺,生成perlin噪聲的塊(最終將它們發送到渲染線程以在自己的時間進行處理)和一個「主」線程,如果需要創建新的perlin噪聲區塊,則更新相機的位置並更新幾何線程。併發與Android GLES glBufferData

前面提到的perlin瓷磚存儲在VBOs中,只有當它們在相機的某個距離內時纔會渲染。緩衝區初始化總是立即開始

這一切運作良好,沒有任何明顯的問題。

然而,

當通過glBufferData()(在由單獨的幾何線程處理之後)將圖塊上載到GPU時,渲染線程始終顯示爲阻塞。我認爲這是因爲Android在屏幕緩衝區呈現之前隱式調用glFinish()。很明顯,我希望數據上傳在後臺執行,而其他所有內容都正在繪製 - 如果需要,甚至可以在多個幀中進行。

我看過google,唯一能找到的解決方案是使用glMapBuffer/glMapBufferRange(),但這兩種方法在GLES2.0中不支持。無論是任何的同步對象 - glFenceSync等等等等...

....

任何幫助嗎?

P.S.我沒有提供任何代碼,因爲我認爲這不是必要的,因爲這個問題對我來說似乎更理論。不過,我當然可以根據要求製作一些。

的遊戲截圖至今: http://i.stack.imgur.com/Q6S0k.png

回答

0

Android不調用glFinish()(glfinish在()實際上是在IMG的GPU的無操作)。問題是,glBufferData()不是一個異步API。你真正想要的只是在OpenGL ES 3.0中可用的PBO,並且提供了執行異步拷貝(包括紋理上傳)的能力。

你是否總是使用glBufferData()?您應該儘可能多地使用glBufferSubData(),以避免每次重新分配VBO。

+0

真的嗎?哦,真是太可惜了。我真的很驚訝,沒有任何處理ES2.0中的不同步的好方法,說實話,對我來說這似乎是一個常見的用例。我想這似乎需要看看其他一些方法。 出於好奇,多少性能增加會切換到glBufferSubData()而不是glBufferData()yield?無論如何,我正在考慮這樣做,但我想先解決異步問題。 – Mike

+0

性能差異將取決於您的VBO和您正在測試的驅動程序/ GPU的大小。但是你應該看到明顯的差異(類似於glTexImage2D vs glTexSubImage2D)。 –