2010-03-29 161 views
10

Apple's Technical Q&A on addressing flickering (QA1650)包括以下段落。 (重點煤礦。)glClear()如何提高性能?

您必須提供顏色與屏幕上的每個像素。在繪製代碼的開始處,最好使用glClear()來初始化顏色緩衝區。一個全屏幕清楚每個顏色,深度和模板緩衝的(如果你使用它們)在幀的開始也可以一般提高應用程序的性能。

在其他平臺上,我一直髮現它是對的優化而不是如果要繪製到每個像素,請清除顏色緩衝區。 (爲什麼要浪費時間填寫,如果你只是要覆寫清晰的彩色顏色緩衝區?)

如何以glClear()的調用提高性能?

+0

很多情況下,忽略清除顏色/深度/模板緩衝區的情況並非如此。正如我在其他答案中的一些評論中所解釋的,它與現代GPU中的緩衝區壓縮有關。就現代GPU而言,我在談論Radeon 9xxx系列。清除這些緩衝區實際上是幾乎所有GPU架構的性能提升。 – 2013-09-18 20:25:39

回答

15

這是最有可能與基於區塊的渲染,從而將整個視口磚(小窗口,一般可以是32×32大小的),這些瓦片被保存在速度更快的記憶。這個較小的內存和真實的幀緩衝之間的複製操作可能需要一些時間(內存操作比算術操作慢得多)。通過發出glClear命令,你是在告訴你不需要先前的緩衝內容的硬件,因此並不需要複製的顏色/深度/無論從幀緩衝較小的區塊存儲。

+1

如果您需要更多詳細信息,請查看這些參考文獻: - http://developer.amd.com/gpu_assets/gdc2008_ribble_maurice_TileBasedGpus.pdf - http://www.beyond3d.com/content/articles/38/ – AdilYalcin 2010-03-29 20:34:03

+0

它是與顏色/深度/模板壓縮有關。簡而言之,通過適當的方式清除緩衝區將使每個tile(*這也適用於常規GPU,而不僅僅是像PowerVR *那樣的基於Tile的延遲渲染)更容易壓縮並提高吞吐量。這些緩衝區的壓縮不是爲了節省存儲空間,而是爲了減少必須傳輸的數據量。清除瓦片是在每個瓦片中設置幾個比特的微不足道的事情,並且一旦完成,清除的瓦片從存儲器獲取非常便宜。 – 2013-09-18 20:16:14

-4

我可以肯定地確認您必須爲屏幕上的每個像素提供顏色

我在建立在Xcode的iPhone OpenGL的模板裸露的骨頭測試應用程序驗證了這一點:

[context presentRenderbuffer:GL_RENDERBUFFER]; 
glClear(GL_COLOR_BUFFER_BIT); 

如果我離開了glClear線(或迴路中移動它進一步下跌,一些其他的OpenGL後調用),線程(通過CADisplayLink運行)幾乎不再有任何更新。看起來好像CPU/GPU同步失控並且線程被阻塞。 如果你問我很嚇人,而且完全不符合我的期望。

順便說一句,你不一定必須使用glClear(),只是繪製一個全屏四核似乎有相同的效果(顯然,一個紋理四是更昂貴的)。看來你只需要使所有的瓦片無效。

+2

** - 1 **:您應該使用'glClear(...)',現代GPU使用顏色緩衝區,深度緩衝區和模板緩衝區壓縮。清除緩衝區非常便宜,因爲這些緩衝區通常是分層平鋪的,並且清除緩衝區的過程相當於翻轉每個區塊中的一個或兩個位。如果您經常清除緩衝區,它甚至可以幫助進行許多早期的片段測試和一般幀緩衝區吞吐量。在基於圖塊的延遲渲染GPU(例如PowerVR SGX - 所有iOS設備)上,出於類似的原因同樣重要。 – 2013-09-18 19:59:00

3

隨着在iOS 4,這晚於接受的答案官方評論長遠角度看...

我認爲,應該在與蘋果公司的有關GL_EXT_discard_framebuffer擴展的意見,應該始終在使用一併閱讀如果可能的話(甚至在其他地方)結束一幀。丟棄幀緩衝區時,將其內容置於未定義狀態。那的好處是,當你下次結合一些其他的幀緩衝,從未有任何需要您的緩衝區的當前內容存儲出去的地方,同樣,當你下次恢復緩衝區沒有必要對它們進行檢索。這些都應該是GPU的內存拷貝,而且非常便宜,但它們遠沒有免費,iPhone的共享內存架構可能意味着更復雜的考慮可能會出現。

基於iOS上的合成模型,這是合理的假設,即使你的應用程序不綁定,並在其範圍內取消綁定幀緩衝區,GPU具有做這些任務隱含至少一次爲每個幀。

我敢想,司機是足夠聰明的,如果你做的第一件事情是清楚的,你會得到放棄擴展的好處的一半,而沒有實際使用它。

-2

嘗試在傳遞給ChooseConfig的glSurface屬性中減小幀緩衝區的大小。

例如,爲最小值設置屬性爲0或完全忽略它們以使用默認值,除非您有特定要求。

+0

這與OP的問題無關... – RecursiveExceptionException 2016-09-11 17:43:14