2013-05-15 13 views
1

我使用opengl在android上開發了一款遊戲,並且性能有點問題。OpenGL/Android大型精靈四元組性能不佳

比方說,我想繪製一個部分充滿草「灌木叢」的背景。灌木有不同的x,y,z,不同的尺寸等等(每個灌木是2D精靈),並且可能部分隱藏彼此(我使用透視相機)。我有一個大的性能問題,如果這些精靈是大(即四大小,而不是紋理尺寸/分辨率):

  • 如果我用一個經典的前向後畫(避免透支),我發現我自己有問題,因爲(我認爲)阿爾法測試。即使灌木叢只有不透明和完全透明的像素(沒有部分透明度),並且如果我使用適當的alpha測試比較(GL_EQUAL 1),性能很差,因爲很多像素都必須經過alpha測試(如果我理解正確) 。

  • 如果我在禁用alpha測試的情況下使用背面顯​​示器,即使在禁用深度緩衝區寫入時也不會失去很多性能(但是這次是因爲透支問題)測試被禁用的方式)。

我有,如果使用前不帶alpha測試背佳表演,但當然精靈缺口完全消失,這實在是非常糟糕的。所有的灌木都具有相同的紋理,我使用16位顏色,mip貼圖,幾何配料,剔除面,無着色等。我所能想到的所有改進性能(在其他情況下都不錯) ,除了紋理壓縮。我甚至過濾了精靈,以避免在屏幕上顯示出來。爲了測試的目的,我也嘗試了一些「暴力優化」,例如使紋理完全不透明,大幅降低紋理分辨率,禁用混合等,但除了alpha測試刪除之外,沒有什麼是非常出色的性能。

我想知道我是否忘記了一些東西來幫助演出。回到前面創建透支,由於alpha測試,前後是緩慢的(我不希望我的灌木叢是「方形」圖像,所以我不能禁用alpha測試)。如果我創建更小的精靈,性能會更好(即使有更多精靈),但這只是一種解決方法。

總結,如何顯示需要切割的重疊大四邊形而不會損失性能?

PS:我正在測試一個nexus。

PS2:一些優化建議不創建四邊形,但幾何更「貼合」紋理,但它似乎是一個非常乏味的過程,並不會幫助我很多,我認爲。

回答

1

由於早期z:硬件可以在光柵化之後,在進行紋理獲取或着色之前進行深度測試,因此前後繪圖通常是有益的。通過前後排序,大多數片段不能進行深度測試,並且可以節省大量紋理帶寬,着色處理量和zbuffer寫入帶寬。

但alpha測試打破了這一點。如果一個片段通過了深度測試,它可能仍然會被alpha測試所殺死,所以直到貼圖/着色之後,zwrite纔會發生。大多數可以做早期-z的硬件仍然必須在管​​道中的同一點進行深度測試,因爲它使用zwrite,所以使用alpha測試,最終在紋理化和着色之後執行ztest + zwrite。因此,前後排序只能節省您的zwrite帶寬,沒有別的。

我認爲你有兩個選擇,如果你真的想要一個顯著重疊的大精靈:

(a)僅使用兩個或三個不同的Z值對你的精靈。通過混合(和alpha測試,如果有幫助)將它們反覆繪製。圖層中沒有重疊:您可以在原始資源中預先渲染每個圖層,也可以在運行時渲染一次,然後將其左右移動。 (b)如果你的精靈有一個由半透明邊框包圍的大型不透明區域,你可以在不進行alpha測試的第一遍中繪製不透明區域,然後將邊框繪製爲單獨的通道。這將減少阿爾法測試片段的數量。

+0

非常感謝您的回答。我實際上並沒有意識到阿爾法測試從頭到尾破壞了很多優點。 – Consign