2011-07-18 38 views
1

我聽說glBindTexture真的很慢,必須儘可能避免,但對於用C++編寫的2D平鋪OpenGL遊戲(每幀最多400張屏幕),是否真的需要紋理地圖集?另外,重新計算每個tile的紋理座標的開銷要小於僅在需要時才更改紋理的開銷(我一行一行地繪製tile並在下一個tile與當前tile不同時調用glBindTexture)?即使是2D遊戲,真的需要紋理地圖集嗎?

編輯:瓷磚是32×32像素,都將放入一個地圖集

回答

4

綁定另一個紋理可能比根據您的使用模式認爲便宜,如果你只是有點幸運。現代GPU具有多個紋理集,驅動程序可以相對輕鬆地進行切換(請參閱lengthier explanation)。特別是如果您在適度變化的瓷磚之間切換,則很可能不會成爲完全失速。

但是事情是,你不知道。它也可能不同。只要你不知道,你應該承擔最壞的情況,而不是最好的。
另外,可怕的管道拖延不是可能在紋理綁定中花費昂貴的唯一東西。 GL必須取消引用至少兩個指針(緩存未命中的可能性很高),並在綁定對象後對對象和整體renderstate執行一些不平凡的一致性檢查。
那些緩存效果和一致性檢查是一個問題,它們是nVidia仍然在研究「無圖像」的原因。他們稱之爲「新的瓶頸」。

所有這一切可能不用於臺式機上500度狀態的變化關係,但作爲戈茲貝達已經指出的那樣,在手持設備上的問題。如果沒有其他(即使它不影響幀速率),它會導致電池耗盡更快。
這是一個遺憾,因爲它是完全不必要的,紋理地圖集很容易實現,沒有任何開銷,並且所有涉及的計算都是微不足道的(因爲您不使用mipmap)。

+0

「glBindTexture」的開銷與其他狀態的開銷是否類似於「glColor *」之類的調用或稍高? –

+0

安全的假設是,glBindTexture非常昂貴。但是,如果改變的紋理在它們的參數中是相同的,即只有數據改變,那麼改變可能很快。 – datenwolf

3

是的它確實有所作爲。雖然它是否會影響您的幀速率很大程度上取決於許多因素,例如硬件或每個圖塊的分辨率。一般來說,雖然紋理圖紋不會造成任何傷害,但它會提供更好的性能。

此外,由於您可能無法將所有拼貼塊放在同一圖集中,因此渲染所有使用給定紋理圖集的拼貼圖然後切換到下一個紋理圖集並渲染所有圖塊使用那一個的瓷磚。這種方式只會改變場景中紋理圖集的紋理。

這對於諸如手持設備(iOS,Android等)的東西變得更加重要,但即使在高端PC上,性能改進也可能是顯着的。