1. 程式人生 > 實用技巧 >《UE4遊戲開發》之 《查cook資源失敗,問題記錄》

《UE4遊戲開發》之 《查cook資源失敗,問題記錄》

  1. 當專案打包時,cook出錯,但是從原始引擎提供的資訊中,沒有提示具體的那個資源出錯,要查到出錯資源,還是非常麻煩。
  2. 下面就材質cook出錯,增加一些日誌,方便查詢問題做簡單記錄
  3. 材質cook的一個階段,是收集MaterialShaderMap,如果在這個階段收集的資訊出錯,將會在FShaderMapContent::GetOutdatedTypes函式中,因為Shaders指標指向的記憶體有問題而出錯,通過斷點發現,FShaderMapContent這個類物件指標為null,而這個類物件的來源於AllMaterialShaderMaps中,但是通過純斷點除錯,發現FMaterialShaderMap::GetAllOutdatedTypes這個函式是多執行緒執行,所以檢視變數的值可能會錯亂,所以通過增加日誌的方式,永久性解決這一問題
  4. 首先在UMaterialInstance::CacheShadersForResources函式中,新增材質例項母材質名字日誌在這裡插入圖片描述
  5. 然後在AllMaterialShaderMaps.Add處,列印AllMaterialShaderMaps的個數,可以通過這個個數判斷列印的母材質例項名字這條資訊對應的AllMaterialShaderMaps中的索引值在這裡插入圖片描述
  6. 最後修改FMaterialShaderMap::GetAllOutdatedTypes中的實現,並列印當前執行的AllMaterialShaderMaps的索引值,當在該函數出錯時,將會打印出出錯的索引在這裡插入圖片描述
  7. 如何判斷:通過出錯的索引 + 1,在日誌中去找【FMaterialShaderMap->AllMaterialShaderMaps Num:】這條日誌;通過該資訊,尋找附近【CacheShadersForResources->BaseMat】日誌,該日誌會定位出錯的母材質和材質例項
    在這裡插入圖片描述
    在這裡插入圖片描述
    PS:以上日誌的對應關係,是通過斷點查變數值,對比變數地址得來的