呼.....說來話長了.....

第一個問題, 什麼叫CPU餵飽GPU:
寫遊戲的人通常都不說什麼餵不餵飽, 又不是養小孩還是寵物. 一般都叫做CPU Bound或是
GPU Bound. 或是換個說法, 「瓶頸」(bottleneck)是在CPU或是在GPU上. 我們把CPU看成
上游的工廠, 專門生產材料跟半成品, 把GPU看成下游工廠, 把上游工廠做出來的材料跟半
成品做出成品. 如果上游(CPU)供應材料/半成品不及, 那下游(GPU)就無法發揮百分之百的
實力來生產出成品(畫面), 這叫做CPU Bound, 我在想所謂CPU「餵不飽」GPU大概是指這種
情形.
不知道有沒有人注意到, 我一直寫上游供應「材料及半成品」, 因為CPU也要事先處理一些
事情才會把東西送到顯示卡去. 例如一輛車在跑, 車輪怎麼轉, 該轉多快, 移動到什麼地方
等等都需要CPU先處理過才會交給顯示卡去畫.通常CPU以一個「物件」(mesh object)當成一
個處理的單位,一個mesh object通常有獨立的網格, 材質貼圖及shader.例如說一輛車有四
個輪子, 通常一個輪子是一個物件, 但是也可以再拆解成輪胎跟輪圈(因為使用的材質跟Shader
不一樣要分開處理). 一個畫面要畫的物件愈多, CPU就要花更多的時間來處理, 愈容易造成
CPU Bound.
而GPU Bound就剛好相反, 製造成品的下游工廠來不及消化上游工廠送來的東西, 變成上游
工廠在等下游工廠生產完一批產品才會再送材料跟半成品過去, 是CPU在等GPU.
就單一格畫面來說CPU的負擔是固定的, 單一畫面該處理的物件有多少是固定的, 但是GPU就
很難說了,同樣的一格畫面,同樣物件數目, 解析度大小, 有沒有開AA, 遊戲中Shader的精細
程度(就是一般遊戲中的畫質選項)都會影響GPU會不會很吃力的工作. 所以要讓GPU很操(出
現GPU Bound)比較容易. 但是這也要看遊戲程式的寫法, 不同的寫法會有不同的影響. 基本
上遊戲都會儘量把CPU Bound排除掉, 像3DMark這種更是嚴重偏向GPU Bound的程式.
第二個問題, 為什麼遊戲這麼吃CPU?
遊戲是屬於必需即時反應玩家動作的程式, 同時遊戲也是一個不斷在變化的環境, 就算你不
動, 遊戲的世界還是在運作, AI操作的敵人還是會動, 草還是會搖, 雲還是會飄. 這個大家
都能理解吧? 所以遊戲的程式是寫成百分之百消耗所有能得到的CPU資源. 不像其它軟體是
user有動作才來處理一下, 沒動作的時候就不消耗CPU資源. 影片播放算是一般程式比較吃
CPU資源的, 但是也只要一秒鐘可以處理完30格就好. 但是PC遊戲不太會把更新速度鎖住,
都是全速全力顯示, 能60格/秒就跑60格, 能跑100格/秒就跑100格, 沒有上限的. 所以通
常就把CPU的資源百分之分吃掉了. 我們一般會看到CPU資源大約被吃掉5x%, 那是因為
windows的工作管理員是把多核CPU的處理能力全部加起來為100%, 遊戲通常只會佔掉
一個核心的工作, 同時可能會把音效, 網路, 輸入等工作切成別的執行緒(thread), 所以會再
稍微用掉另一個CPU核心一點點效能. 在雙核或有HT的系統,就變成總共耗掉5x%的CPU效能了.