要實現這樣一段邏輯,用GPU畫3D圖,用GDI畫二維圖元,怎麼樣效率高。相傳Vista年代,是這樣乾的:
- 硬體渲染的東西在GPU上做完
- 讀回CPU端
- 把GDI這些用軟體渲染
- 兩者混合
- 拷貝到視訊記憶體顯示
這樣的話,相當於整個螢幕都要維持2份拷貝,並且要互相同步。早期的vista驅動上,D3D/OGL和GDI混合使用的話閃得要死或者慢的要死,就是這個原因。
於是新的wddm要求驅動提供overlay和blt,所以流程變得很簡單高效:
- 硬體渲染的東西在GPU上做完
- 把GDI這些用軟體渲染
- BitBlt到GPU端作為overlay
這樣只需要在GPU端維護一份螢幕拷貝,CPU端只需要短暫地維護一個區域性GDI的內容就可以了。
這也解釋了為什麼過去大型遊戲在視窗模式下渲染比較慢,而全屏模式下比較快。全屏模式下,顯示卡是獨佔的,而且不需要與其他桌面程式(工作列等 )和其他視窗坐混合,甚至桌面佔用的記憶體也會被釋放,記得曾經我的老爺機退出大型遊戲時,視窗黑屏,接著慢慢刷出背景和桌面圖示,大概就是這麼個人道理吧。Win7 時代不一樣了,GDI可以blit到視訊記憶體,而Aero特效本身也是硬體加速的,所以全屏和視窗模式應該差別不大了。