這里嘗試將工作中遇到的一些用于CPU計算消耗優(yōu)化的技術(shù)手段匯總到一起缎岗,方便需要的時候查詢使用。
0. 數(shù)據(jù)規(guī)格
在優(yōu)化之前,需要明白當前場景中的數(shù)據(jù)是否是合理的弃揽,即drawcall鼓择、面數(shù)等在目標機型上是否超標等三幻。
對于Drawcall,可以簡單基于Nvidia在GDC上的分析給出:
25K batchs/sec 會吃滿 1GHz 的 CPU呐能,100%的使用率
按照這個數(shù)據(jù)念搬,也就是說,1GHz的CPU摆出,如果按照幀率30來算朗徊,每幀提交25k/30=830個drawcall就跑滿了,基本干不了別的偎漫,而我們按照當前Steam的主流硬件配置來看爷恳,當前主流的PC為4核,頻率在3GHz左右象踊,按照這個配置温亲,全跑滿,也就是830x3x4=9960個drawcall通危,假設(shè)兩個核用于提交Draw Call铸豁,那就是接近5000個Drawcall,雖然這個數(shù)字跟實際數(shù)字可能并不完全匹配菊碟,但是數(shù)量級應(yīng)該是數(shù)千這個級別节芥。移動端的數(shù)據(jù)通過網(wǎng)上的一些文檔大致了解,比如參考2020年的一個回答,大概drawcall在數(shù)百到一千之間(奇怪的是头镊,這個數(shù)據(jù)跟當前移動端高端機的CPU配置[8核蚣驼,2~3GHz]并不十分匹配,不清楚其中有什么樣的隱秘)相艇,面數(shù)在數(shù)十萬到百萬之間颖杏。另外,這里也給出PS4的推薦drawcall數(shù)為2000坛芽,面數(shù)約為百萬級別留储。
對于面數(shù),由于每個面的繪制消耗取決于面片的位置(是否存在overwrite)以及面片的尺寸(fillrate)和渲染shader復(fù)雜度(PS消耗)咙轩,因此并沒有一個簡單的公式可以給出具體的數(shù)據(jù)获讳,只有一些偏經(jīng)驗的參考數(shù)字,具體數(shù)字在前面已經(jīng)給出活喊,實際使用中可以通過demo進行確認丐膝,什么級別的面數(shù)才是適合自己游戲的。
1. ISPC
ISPC是Implicit SPMD(single program multiple data) Program Compiler的縮寫钾菊,可以看成是CPU版本的Shader(SIMD特點)帅矗,相對于傳統(tǒng)的手動實現(xiàn)的sse、avx而言煞烫,這種技術(shù)可以使得代碼編寫更加具有可讀性(通過C語言完成浑此,之后交由編譯器翻譯成對應(yīng)的SIMD代碼),能夠支持目前所需要支持的絕大多數(shù)平臺(部分平臺如arm支持還存在一定的問題)红竭,目前在UE的眾多離線特性如貼圖壓縮尤勋、lightmass的embree以及運行時計算特性如chaos & animation上都有嘗試應(yīng)用喘落,具體參考文獻[1][2]茵宪。
2. 移動端大小核架構(gòu)
移動端CPU設(shè)計的兩大目標是高性能與低消耗,在這個目標下瘦棋,ARM提出了大小核的CPU架構(gòu)稀火,這是一種由兩種不同的核組成的異構(gòu)CPU架構(gòu),其中大核具有較強性能赌朋,但是也會導(dǎo)致較高消耗凰狞,通常用于處理一些重度計算工作,小核性能較弱沛慢,同時消耗也較低赡若,通常用于處理一些輕度計算工作,大小核架構(gòu)中的兩種核共享的是同一套指令集架構(gòu)团甲,詳細的信息可以參考[3]逾冬。
未完待續(xù)
參考文獻
[1] [gdc20]ISPC in UnrealEngine4
[2] ISPC In Unreal Engine 4: A Peek Behind The Curtain
[3] big.LITTLE Technology: The Future of Mobile