在看《Unity shader入門精要》的時候,講到CPU和GPU的合作,CPU給GPU傳送圖形繪製命令,如果說按照“傳送一個命令,執行一個繪製操作”這樣的模式來,就會造成效能浪費啊。你想,如果GPU繪製時間比較長,那CPU是不是要等待,本來這個時候它可以多發幾個命令的;或者CPU被其他任務佔據了,GPU是不是也要等待?
這就是一對一的接頭造成的問題,而建立一個緩衝區就可以一定程度的緩解。“緩衝”,不要去想戰爭裡的緩衝,而要去想水池的模型:一個水池,一個開關進水,另一個開關放水;當水比較多了,進水就暫停下,水少了就開啟。這樣,放水的開關是不是可以保持一直有水放,完全不需要暫停,而進水的開關也可以自由的控制進水的節奏。對應到上面,“進水”就是CPU施放繪製命令,“放水”就是GPU執行繪製操作。
緩衝的好處是:兩方都按照各自的節奏進行操作,但是卻又可以完全的順序銜接起來。
視訊緩衝
在年少高接觸電腦的時候,看視訊卡頓的時候就會出現***“緩衝中”的提示啊,雖然你知道這個是視訊在載入的意思,但是TMD為什麼不用“載入中”,而用“緩衝中”***這個讓人想到打仗緩衝區的概念,難道視訊造成破壞需要緩一緩?
首先一個原因我想就是當時使用者體驗這個東西還沒有被深刻強調,很多東西都是“程式設計師式”的取名,Windows的很多操作提示真是讓電腦初學者害怕。
另外就是這個“程式設計師式”的取名背後程式邏輯。在程式的角度,“緩衝”的概念是怎麼出來的?
視訊播放的流程,分成兩大塊就是解碼和渲染。
- 解碼:從網路或本地檔案獲取資料包,提取幀資料,解碼。
- 渲染:把幀資料轉成影象資料顯示或者提供個OpenGL這些圖形處理庫顯示。
這兩部分是不是很像上面的CPU和GPU的關係,如果採用“一對一”的模式,那就是獲取一幀畫面播放一幀,如果那麼網路稍有一點不穩定,就會播放卡頓,時快時慢。
採用緩衝區就是好的解決方案。這大概就是視訊播放卡頓時,為什麼會出現“緩衝中”的提示吧。
“緩衝區”這個詞
“緩衝區”呢,是***buffer***這個詞的翻譯,緩衝很容易讓人產生戰爭緩衝區(提第3次了)的聯想,進而產生理解錯誤(“渲染管線”的翻譯就是這個,pipeline明明該翻譯成流水線)。在很對用到這個詞的地方,它代表的本質上是一段記憶體資料,伴隨著“一進一出動態儲存”的這個模式。之所以使用buffer這個帶有“減輕”意思的詞,大概是它減輕的連線的雙方的接頭的嚴格程度吧。
舉個形象的例子,兩種情況:
-
兩個人合作包餃子,一個人擀皮,一個人包餡。如果你們中間放個盆,擀皮的只管擀皮,擀好了放進盆裡,包餡的只管從盆裡拿出皮來包。這個盆就是緩衝區。
-
兩個人都站在空中的鋼絲上,而且之間隔著2米遠,擀皮的人只能把皮丟給包餡的。這種就是一對一模式了。
對比一下兩種情況的緊張程度,“減輕”的意思在這吧。