讓無數玩家紅溫破防的“正在編譯着色器…”,到底是什麼玩意?
星彡P丨文
正在編譯着色器……
68%
70%
75%
75%
…
啊,怎麼進度條卡住了??臥槽,怎麼閃退了?
不知道你們有沒有發現,近幾年的遊戲,不管單機還是網遊,不管是手機還是PC……
大家在第一次登錄遊戲的時候,或者剛更新完遊戲,經常會看到一個“正在編譯着色器”的進度條。
記得去年《黑神話:悟空》剛出的時候,就有很多網友調侃:遊戲還沒開打,九九八十一難就已經開始了。
第一難是解壓遊戲,有的人下載完解壓了十幾分鍾,有的人解壓兩三個小時。第二難就是着色器編譯,多少人卡在這塊了。
手遊更是如此。舉個例子,我手機裏有一款二次元射擊遊戲叫《塵白禁區》,平時做做日常收個菜也就1分鐘不到,當做休閒副遊挺好的。
然而我每次登錄都會卡在“正在編譯着色器”這個步驟,眼看着進度1% 1%的跳動,過程極其緩慢,而且特別佔用資源,CPU直接滿載。
手機變得特別發燙不說,我還不敢隨便關閉手機屏幕。因爲一旦觸發鎖屏,進度條可能就罷工了。
嗨呀,現在的二遊普遍都是PC手機雙端,畫面越來越好,結果卡“編譯着色器”的情況也是越來越普遍了,網上一片怨聲載道。
搜索“着色器”的關鍵詞,你能看到很多《鳴潮》《原神》等等……不同手遊玩家的相同吐槽。
甚至還有像華爲鴻蒙NEXT這樣,因爲鴻蒙原生《原神》編譯着色器的速度特別快,只用了區區3分鐘,而被UP主直呼“黑科技”的情況。
所以你有沒有好奇過,“着色器”到底是什麼東西?
今天隨便聊聊這個話題吧。
當然,BB姬不是什麼專業技術媒體,如果有什麼錯漏的地方,大家可以在評論區指正和補充。
01
首先解釋一下,“着色器”的英文是Shader。
它是一段代碼,一個程序,運行在GPU(也就是你的顯卡)上面,負責計算每個像素的光照、顏色、紋理、反射、折射等效果。
簡單來說,着色器相當於給GPU讀的“施工說明書”,GPU有了這個說明書,才能知道遊戲裏的畫面該如何渲染。
如果這本“說明書”沒編好或丟了,你會看到各種詭異畫面:比如走着走着,場景突然加載不出來,模型漆黑一片,或者角色眼睛變成詭異的紫色,缺少貼圖。
類似這種↓
還有這種↓
(BV1xs421w7aj,來自@Kukku_くっく)
那麼問題來了,爲什麼會出現“下載十分鐘、編譯半小時”的情況呢?
——這是因爲每個玩家的硬件配置千差萬別。顯卡型號、驅動版本、遊戲版本、甚至操作系統,標準太多了。只要有一個變量變了,之前的說明書對機器來說就成了“天書”。
尤其是現在還要考慮手機端……技術美術也想提前給你編譯好,但總是會導致各種各樣的BUG,只好把編譯過程放在本地客戶端進行。因此,當你第一次啓動遊戲或更新驅動後,CPU就要根據你當前的環境,現場重新進行“翻譯”。
——將程序員編寫的代碼,翻譯成機器能看懂的二進制指令(0和1)的這個過程,就叫作“編譯着色器”。網上解釋的視頻很多,感興趣可以搜一搜。
據說新遊戲的圖形api基本都是dx12或者Vulkan,新api接入了pso緩存技術,提前編譯可以提高運行性能——於是有了肉眼可見的“編譯着色器”過程。
而老遊戲的dx11/dx10、OpenGL那些api就不需要,因爲畫質也就那樣,運行的時候CPU順帶就可以把這活兒幹了,相對無感。
現在有些廠商就比較坑爹了。
更新一些圖像處理啊什麼的,它不在公告裏說,直接默默更新了,這種熱補丁也會導致重新“編譯着色器”,最典型的就是《APEX英雄》。
我以前有個打“派”的朋友,他那臺老爺機每次進遊戲前先編譯10分鐘,再讀10分鐘地圖,敵人影都沒見着,半個小時已經過去了。
當然,也有一些遊戲支持“後臺編譯”或者“先跳過,等後面手動編譯”的。缺點是如果優化不到位,很容易遇到各種詭異的BUG。
像PC上的《使命召喚》,左上角有“着色器預載 XX%”的進度條,我之前玩戰區的時候就被噁心壞了。
加載慢不說,還經常卡進度。不加載完畢你又不敢進匹配,否則打到一半冒出一個“着色器優化”警告的彈窗,直接崩掉遊戲。
當時網上流傳着一些玄學土方子,像是反覆點擊匹配再取消來“手動催促”進度條;或者乾脆在靶場掛機,自己在一旁玩手機,等它自然加載完成。
有人喜歡第一次加載時間長點,玩的時候絲滑點更好。也有人覺得,我就鎖定一定幀數(比方說60幀),多出來的算力拿來編譯着色器更好。
——怎麼選擇,最後還是要看廠商取捨,考慮遊戲的穩定性,只能無奈妥協。
02
面對漫長的編譯等待,我們這些臭打遊戲的能做的也不多,全看開發者、軟件硬件,以及微軟的優化。
舉個例子,你可能在Steam設置裏見過“下載 - 着色器預緩存”的功能,不知道有什麼用。
它的初衷很美好:當同配置的其他玩家編譯好着色器後,Steam會將其上傳,讓你直接下載現成的緩存,從而跳過編譯過程。
主要還是針對Steam Deck掌機/主機這種硬件規格高度統一,且基於Linux架構的自家設備,加速Vulkan/OpenGL遊戲。
對於主流的 Windows遊戲基本沒有用。加上下載服務器經常“由於衆所周知的原因”連接超時,反而會導致啓動變慢。所以我建議PC玩家直接關掉。
另外,我記得NVIDIA 控制面板裏也有一個“着色器緩存大小”設置,默認通常只有512MB(放C盤上的),導致了很多動態編譯的遊戲切換時會搶佔空間。
設置成較高的緩存大小限制(比如5G以上或者無限制),可以緩解一部分重複編譯帶來的卡頓。代價是會更佔用磁盤空間。
不過要注意,有的人筆記本電腦就一塊固態,還喜歡給硬盤分區,C盤給個50G將將夠用,一不注意很容易被塞爆。
前兩天,微軟也在ROG Xbox Ally掌機推出了一個“雲端編譯着色器”技術,可以把編譯的任務放到雲端處理,降低電池消耗,避免風扇呼呼轉。
還有一個同步推出的“高級着色器交付”功能,允許遊戲下載時預加載着色器,減少首次運行卡頓,《崩壞:星穹鐵道》已經適配了。
這種就是微軟聯合遊戲廠商的結果——如今“編譯着色器”花費的時間、額外功耗已經成爲一個痛點。爲了讓遊戲流暢,程序員們簡直操碎了心。
03
相比之下,PS5或Xbox這種遊戲主機就省事多了。因爲硬件規格高度統一,廠商直接預編譯好一份“標準說明書”隨遊戲分發,幾乎沒有重新編譯的煩惱。
這是我覺得現在主機相比PC,爲數不多的優勢之一:即下即玩,不折騰。以前我們總在聊獨佔陣營、聊生態圈,後來發現這些都是浮雲。
→但反過來,這種設計也成爲了模擬器的痛點。
搗鼓過Yuzu、Ryujinx之類Switch模擬器的朋友,一定對那種“莫名其妙的小卡頓”記憶猶新:遊戲剛開始的前幾分鐘、初次進入新區域、或者放出某個特效,畫面總是會卡一下,非常影響遊玩。
類似現象存在很長一段時間了,前代的Wii模擬器就有。
(Wii模擬器上的《銀河戰士3》,卡頓比較明顯)
歸根結底,主機遊戲在設計之初就沒考慮過複雜的 PC 硬件環境——這也是爲什麼Switch發售快十年了,模擬器該卡還是會卡,其實就是着色器編譯的鍋。
越是畫面複雜的Switch遊戲,像《塞爾達傳說:王國之淚》這種,越是頻繁出現幀數暴降,卡成PPT的情況。
一般正常遊戲3~5個小時以後,模擬器基本上自動記錄好了大多數的着色器,後續再重開遊戲,同樣的場景和特效,才變得100%流暢。
所以模擬器非常喫CPU性能,你CPU不行,別說5090顯卡了,9050來了都是無用功——顯卡好可以開更高分辨率,但是幀數問題還是要看CPU的。
當然,這個話題涉及到灰色地帶,就不繼續展開了。
如果你正在經歷着不正常的頻繁卡頓,先不要慌——着色器緩存正在努力改善你糟糕的體驗——而這個改善的過程,恰恰成了糟糕體驗的來源。怎麼辦?涼拌。
我們能做的只有不要閒的沒事就換一個顯卡驅動,不要沒事閒的就重新裝一遍系統,不要遊戲一出問題,就下意識把它卸了重裝……沒有這些多餘的動作,直接正常玩就行了。還有你們,做遊戲的,不要每天瞎雞兒熱更新啊!
-END-