資源記憶體佔用

请明月發表於2024-10-18

在一個較為複雜的大中型專案中,資源的記憶體佔用往往佔據了總體記憶體的70%以上。因此,資源使用是否恰當直接決定了專案的記憶體佔用情況。一般來說,一款遊戲專案的資源主要可分為如下幾種:紋理(Texture)、網格(Mesh)、動畫片段(AnimationClip)、音訊片段(AudioClip)、材質(Material)、著色器(Shader)、字型資源(Font)以及文字資源(Text Asset)等等。其中,紋理、網格、動畫片段和音訊片段則是最容易造成較大記憶體開銷的資源。

一、紋理

  • 慎重選擇紋理格式(紋理格式不僅影響著紋理的記憶體佔用,同時還決定了紋理的載入效率。)
    • Android平臺:ETC
    • iOS平臺:PVRTC
    • Windows PC:DXT
  • 慎重選擇紋理尺寸(一般來說,紋理尺寸越大,則記憶體佔用越大。所以,儘可能降低紋理尺寸,如果512x512的紋理對於顯示效果已經夠用,那麼就不要使用1024x1024的紋理,因為後者的記憶體佔用是前者的四倍。)
  • 關閉不必要的Mipmap功能,如UI紋理 (開啟Mipmap會將紋理記憶體提升1.33倍。)
  • 關閉Read & Write(開啟該選項將會使紋理記憶體增大一倍。)

二、網格

  • 刪除不必要的Normal、Color、Tangent資料

這些資料的存在將大幅度增加Mesh資源的檔案體積和記憶體佔用。其中,Color資料和Normal資料主要為3DMax、Maya等建模軟體匯出時設定所生成,而Tangent一般為匯入引擎時生成。
更為麻煩的是,如果專案對Mesh進行Draw Call Batching操作的話,那麼將很有可能進一步增大總體記憶體的佔用。比如,100個Mesh進行拼合,其中99個Mesh均沒有Color、Tangent等屬性,剩下一個則包含有Color、Normal和Tangent屬性,那麼Mesh拼合後,CombinedMesh中將為每個Mesh來新增上此三個頂點屬性,進而造成很大的記憶體開銷。
這些資料主要為Shader所用,來生成較為酷炫的效果。所以,使用時應作好考量,該模型的渲染Shader是否需要這些資料進行渲染。

相關文章