當前位置: 華文問答 > 數碼

移動 GPU 和桌面 GPU 的差距有哪些?

2013-01-17數碼

移動GPU和桌面GPU最核心的差別在於渲染流程不同。目前主流的移動GPU,無論ARM、高通還是Imagination,其GPU都是TBR(Tile Based Rendering)。而桌面GPU,無論NVIDIA、AMD還是Intel,都是Immediate Rendering. 下面我就來說說什麽叫TBR,什麽叫Immediate Rendering。

說在前面:

從opengl定義的GPU pipeline來看,一幀3D場景是透過以下幾個過程渲染出來的。

「Vertex前端」(負責準備數據和Vertex Shader指令)->"Vertex Shader"(計算定點位置,顏色,紋理座標,光照,等相關工作)->"Primitive Assembly"(負責組裝圖元,比如三角形; 座標系變換,物體座標->世界座標->透視變換->螢幕座標;視錐剪裁;Culling正反面選擇)-> 「Rasterizing」(光柵化,就是將立體場景投影到二維螢幕的過程)->"Early Z/S"(前期depth和stencil測試,決定一個fragment是否被渲染,從而降低後期fragment shader的負擔)->"Fragment Shader"(對一個fragment,即像素,進行渲染。可能涉及到讀取紋理texture。)->"Post Z/S"(後期depth和stencil測試,有些套用在fragment shader中可能會改變該像素的深度值)->"Blending"(將此次渲染結果和之前的渲染結果進行混合)。

1. Immediate Rendering

Ok,說到這所謂的Immediate Rendering,就是將一個圖元(最常見的是三角形),從頭到尾走完整個Pipeline,中間沒有停止。這種結構,控制簡單,容易實作。問題是在做blending的時候需要從儲存單元中不斷讀回之前render的結果,可想而知在繪制一個大的場景時這個頻寬消耗是比較大的。

那為什麽桌面GPU會采用這個架構。首先,歷史原因,最開始設計opengl pipeline的人,正是這些設計桌面GPU的大咖們。不過,最重要的一點是,桌面GPU都是有自身視訊記憶體的,它不需要透過系統總線從系統的DDR memory中讀回數據。所以開銷比較小,是完全可以接受的。但移動端的處理器(基本是可以認為都是ARM處理器)都是統一尋址的。所有的IP都是使用統一的DDR儲存空間,這樣讀回Pixel進行blending就變成了一件非常奢侈的事情。它會嚴重占用系統頻寬,不但功耗提升,而且會影響整個SOC的處理能力(可以想象北京上海的堵車場景)。為了解決這個問題TBR便應運而生了,下面該TBR出場了。

2. TBR

TBR是Tile Based Rendering的縮寫。首先來認識一個概念Tile。什麽是Tile,你可以把它看成一小塊螢幕區域。比如一個螢幕的分辨率為256x256,假定一個tile的大小是16x16,那麽這個螢幕可以看成是由16x16個Tile組成。TBR的精髓就是一個Tile一個Tile的渲染。這樣只需要給GPU配上一塊很小的片上cache(足夠裝下一兩個Tile的內容就行),就能實作高效的blending。那麽,問題來了,根據前面講述的GPU pipeline來看,只有在光柵化的時候才能知道每一個tile中包含的fragment,如何才能做到一個tile畫完再畫另一個tile呢。這裏就需要一種機制將整個場景的圖元資訊(最主要的是位置)都保存下來,並且能在做光柵化時快速的檢索出屬於這個Tile的圖元。所以所有的移動GPU中都會有Tiler這個模組,這在桌面GPU中是沒有的。每個廠家的Tiler實作都是機密,這裏不予討論。我們只要知道Tiler能接收vertex shader的運算結果,並在光柵化之前,選出屬於特定tiler的圖元就行了。有了Tiler,這個GPU Pipeline就被分為了兩部份,一個場景中所有的vertex計算都在光柵化之前完成,最後再一次性raster一個Tile。這樣做還有一個好處就是,可以更有效的在early z中剔除被遮擋的像素,降低了fragment shader的負載。