关于shader.createGPUProgram耗时较高的问题
UNITY對(duì)于shader的加載策略是:只有第一次在相機(jī)中出現(xiàn)時(shí)才會(huì)去創(chuàng)建相應(yīng)的shader,測(cè)試用例如下:
1,創(chuàng)建測(cè)試場(chǎng)景 testscene
2,在testscene中創(chuàng)建一個(gè) cube,為它創(chuàng)建一個(gè)材質(zhì) matx,使用一個(gè)shaderx
3,確保cube不在相機(jī)視野內(nèi)
4,添加一個(gè)按鈕 btnUseShader,添加腳本如下,
public class btnUseShader : MonoBehaviour {public GameObject cube;void Start(){//=============================warm start===============================/*var sv = Resources.Load<ShaderVariantCollection>("warmups");if (sv != null){sv.WarmUp();Debug.LogError("load success ========================================");}*/
//=============================warm end================================
GetComponent<Button>().onClick.AddListener(() => { //當(dāng)點(diǎn)擊按鈕時(shí)將cube移到相機(jī)視野內(nèi),用profiler觀察有線程的cpu波峰cube.transform.position = Vector3.zero;});} }
5,【不使用shader預(yù)熱】:打安卓包測(cè)試,運(yùn)行游戲,ADB方式連接unity profiler,點(diǎn)擊按鈕的一瞬間發(fā)現(xiàn)主線程cpu有一個(gè)明顯的巨大波峰,點(diǎn)擊查看正是shader.createGPUProgram
6,【使用shader預(yù)熱】:將 warm start和 warm end之間的代碼打開,并在Resources目錄下創(chuàng)建一個(gè)名為warmups的shaderVarriantCollection,添加第2步中創(chuàng)建的 shaderx到其中,
再次打包測(cè)試,運(yùn)行游戲,連接profiler,點(diǎn)擊按鈕時(shí)CPU不再有明顯的波動(dòng),說(shuō)明已沒(méi)有了shader.creategpuprogram消耗
總結(jié)
以上是生活随笔為你收集整理的关于shader.createGPUProgram耗时较高的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 强大的mono.ceil
- 下一篇: 空场景在安卓上的渲染消耗问题