2013-02-18 67 views
0

我有大約500個vec4需要可用,但每個對象只有〜15個,並且爲了下一個要繪製的對象而將其更改爲其他15個其他對象,等等。Android openGl ES 2.0快速統一更改

起初我試圖在「統一的vec4行[500]」中存儲所有的數據,這在一些設備上運行良好,但是例如在Galaxy SII上,這會導致即時崩潰,並帶有outOfMemory異常。 比我想那些需要15複製爲每個對象的形式CPU端使用到GPU:

GLES20.glUniform4f(GLES20.glGetformLocation(programHandle, "lines["+i/4+"]"), 
     lines[i], lines[i+1], lines[i+2], lines[i+3]); 

,因爲有相當一些物體被吸入這導致vec4的的很多傳遞到GPU,爲垃圾收集器每2秒調用一次。

「lines」是一個float [4 * lineCount],也許一個上傳整個float []的調用會更快&已經有更高的內存效率,有誰知道該怎麼做?

我相信UBO's會很適合這個問題,但是他們不能用在android上嗎?

有沒有人知道更好的解決方案呢?非常感謝!

GALAXY SII的用戶依賴於你^ _^

+0

爲什麼不能只需使用屬性陣列? – Kimi 2013-02-18 16:14:13

+0

這15個vec4的需要是相同的約1000個頂點繪製(一個部分圓)和超過15個新的vec4的未來1000個頂點,所以使用屬性數組將會更加昂貴我想,如果你認爲否則我會嘗試它這種方式,或者如果你知道一種方法來存儲500個vec4的一次在GPU內存,而不是部分地訪問他們,以放入一個很好的制服。 – 2013-02-18 17:35:44

回答

0

如果你能使用OpenGL ES3.0,那麼你就可以Uniform Buffers支持ES3.0應該支持UBOs。任何Android設備上運行。

0

有幾件事會在這裏:

  • 你必須重新考慮你的解決方案,如果你正在因爲OpenGL技術的垃圾收集器運行。它可能會導致你的幀率不一致。

  • 在我看來,你可能會混淆屬性數組和制服。屬性數組是這裏的解決方案,因爲您希望將每幀必須移動到GPU的數據量最小化。

  • 統一緩衝對象不支持GALAXY SII,它只是有OpenGL ES2.0

    • 如果你真的想用一個統一的大數據集,唯一的辦法會是使用該紋理。 (但是這真的不是在這種情況下建議。)