2016-03-19 58 views
0

我有一個應用程序,當你按下屏幕時,應用程序會在該位置創建一個圓圈並開始增長,直到達到最大尺寸並被刪除。
如何優化我的代碼以繪製大量圈子?繪製很多圈子 - 優化

Iterator<CircleShape> it = mCircles.iterator(); 
    while (it.hasNext()) { 
     CircleShape shape = it.next(); 
     if (shape.getScale().x <= shape.getMaxScale()) { 
      shape.setScale(shape.getScale().x + mGrowSpeed * smoothedDeltaRealTime_ms); 
      draw(shape); 
     } else { 
      it.remove(); 
     } 
    } 

的圓圈在片段着色器通過丟棄像素創建我不需要:

void main() 
{ 
    float d = distance(v_texCoord, vec2(0.5, 0.5)); 

    if (d > 0.5f) 
      discard; 

    gl_FragColor = uColor; 
} 

這裏是我的應用程序的圖片:

enter image description here

回答

1

第一你應該嘗試分析瓶頸在哪裏。我認爲片段着色器仍然很重,但可以進行一些優化。

您正在比較使用通常較慢的根部平方的距離。嘗試做

vec2 vector = v_texCoord - vec2(0.5, 0.5); 
if(vector.x*vector.x + vector.y*vector.y > 0.5*0.5) // or 0.25 

如果您不使用深度緩衝區,在這種情況下可能會使您受益。如果你不使用它,我假設你按照從最老的(最寬的)到最新的順序繪製圓圈。這意味着它會爲每個圓圈實際繪製所有的碎片,然後新的碎片將重新繪製在舊的碎片上。您可以啓用深度緩衝區,並且當您增加圓圈大小時,您可能還會進一步將其放在z座標中。現在將繪圖的順序從最新更改爲最舊,以便後面的圓圈不會繪製出前一個圓圈已經顯示的位置。不要忘記清除深度緩衝區。

還有一些其他潛在的優化,比如在你的情況下,你可能只是繪製圍繞圓圈的描邊,這代表了尺寸的增加並且不清除顏色緩衝區。但是這意味着實際上創建頂點以繪製具有定義寬度的筆畫圓,這將至少增加頂點部分上的負載,但會嚴重降低柵格化和繪製的片段數量。在這種方法中,您需要一個深度緩衝區,但是一旦有新的圓圈出現,您還需要推回當前的深度緩衝區......可以通過單個屏幕重繪來完成,但這是完成正確任務的相當重要的任務。

我能想到的另一種方法實際上是爲圓形中心,顏色和半徑提供一個統一的數組,以便將其送入片段着色器。然後在片段着色器中遍歷數組,並檢查哪個圓形表示實際上是應在該特定像素處繪製的那個,並使用其顏色(如果非有效,則簡單地丟棄以保留當前背景顏色)。這意味着在整個視圖中只繪製一個矩形。沒有深度緩衝區,不需要清除顏色緩衝區。這可能會對片段着色器造成很大影響,但是一些片段會嚴重減少,因此可能會提高性能(或不會)。