2013-10-28 35 views
0

我正在用OpenGL ES 1.x開發一個適用於Android的小型應用程序。沒有glBegin-glEnd功能,因此必須爲要繪製的對象定義頂點(以及顏色和texcoord)數組,然後使用矩陣運算來移動,縮放和旋轉它們。這對大型物體很好,沒什麼可抱怨的...在Android中繪製臨時對象的最佳方式OpenGL ES 1.x

但是,如果想繪製小的「臨時」對象(例如,從A點到B點的一條線),事情會變得有點煩人。因此,我創造了一些小的實用功能,如:

DrawHelper.drawLine(起點,終點)

我注意到兩種方法可以做到這一點。我的問題是哪個版本更受歡迎?既然我們正在處理這樣簡單的幫助函數,並且這兩種方法都很容易理解,那麼即使潛在的速度增益很低,也可能從一開始就寫得儘可能好。所以,請沒有 「標杆和第一識別瓶頸」 .. =)

方法1:

抽籤助手有包含點(0,0,0)和(1,0,0)FloatBuffer。我每次用適當的模型視圖矩陣繪製這條線,將兩個點轉換到所需的位置。

方法2:

抽籤助手有一個虛擬FloatBuffer我用FloatBuffer.put在新的點,每次喂。

方法1對於較大的對象(如圓或其他幾何形狀)顯然更好(?)。簡單的線條或簡單的三角形如何?

回答

1

你總是選擇涉及工作量較少的方法。應用矩陣乘法比兩個向量分配需要更多的計算。此外,矩陣變換方法向GPU(整個4×4矩陣)發送約2.5倍的數據比發送兩個3向量。

OTOH Java增加了通過FloatBuffer的懲罰。

+0

謝謝,我會記住這一點,但我不確定你的論點是否適用於所有情況。假設你想在不同的位置多次繪製一個簡單的正方形。我從別處讀到的內容表明,最好不要改變緩衝區的內容,而是在OpenGL中轉換位置。當然,我也無法證實這是正確的。 (另外,可以想象glTranslate被優化爲只發送3個參數,我不知道..) –

+1

@ user2582805:對於多個位置的問題,您可以使用實例化。不,沒有對glTranslate進行優化。 glTranslate始終在CPU上運行,並在堆棧上的當前4×4矩陣上相乘,然後必須將其傳輸到GPU。 – datenwolf

+0

好吧,我想我會和那個一起去的。謝謝! –