日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity游戏中的一些规范和优化建议

發(fā)布時間:2023/12/13 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity游戏中的一些规范和优化建议 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.代碼規(guī)范和建議

  • 避免Update LateUpdate等函數(shù)內(nèi)頻繁的GC Alloc,避免在Update和LateUpdate內(nèi)有以下操作:

  • 調(diào)用GetComponet()

  • 調(diào)用FindObjectsOfType()

  • 使用GameObject.Tag和GameObject.Name

  • 等等其他有堆內(nèi)存分配的操作

  • 避免頻繁調(diào)用ToString()分配內(nèi)存

  • 避免OnGUI的調(diào)用

  • 禁止使用Debug.Log打印log,用框架中的LogManager統(tǒng)一管理

  • 避免使用枚舉或struct做key進(jìn)行字典查找(除非使用定制的comparer)他們的GetHashCode都有裝箱操作,每次調(diào)用TryGetValue查找都會有內(nèi)存分配.

  • 在使用協(xié)程時盡量復(fù)用WaitXXX對象,而不是每次分配

  • 頻繁創(chuàng)建和更新的字符串盡量緩存,比如CD時間等

  • 盡量避免dict.Values操作,直接遍歷取Values即可

  • 使用CompareTag代替GameObject.Tag

  • 用RayCastNoAlloc替換RayCastAll

  • 用yield return null 代替 yield reture 0

  • 如果文件中不需要Update或Start函數(shù)等,刪掉對應(yīng)的空函數(shù)

  • 盡量少用lambda,創(chuàng)建帶upvalue的lambda對象會產(chǎn)生124B的GC,禁止在Update或for循環(huán)中使用

  • 使用數(shù)組的數(shù)組,而不是多維數(shù)組。如int[i][j]的數(shù)組的數(shù)代替int[i,j]的多維數(shù)組

  • 盡可能避免使用攜程

  • 禁止使用接受字符串參數(shù)的GetComponent等類似函數(shù)的重載方法,使用泛型類型的

  • 代碼中需要訪問到 Transform 組件的位置數(shù)據(jù)時, 盡可能使用 localPosition 代替對 position 屬性的訪問. localPosition存儲在transform中,訪問該值時,Unity會直接將其返回,而position在每次訪問時都會重新計算,如果要經(jīng)常獲取position,可以將其緩存起來。

  • 避免使用LINQ表達(dá)式,部分功能無法在某些平臺上使用,會分配大量GC Alloc。

  • 禁止高頻的字符串拼接. 如無法避免, 必須使用 StringBuilder 代替 "+" 操作符進(jìn)行字符串拼接.

  • Delegate 回調(diào)方法必須適時的解除注冊, 否則回調(diào)方法所屬的對象會一直有引用計數(shù), 繼而引起該對象所引用的資源無法得到釋放.

  • 盡量避免使用 Reflection(反射).

  • 盡量避免使用可變參數(shù)(param object[] args), 避免裝箱拆箱.

  • 簡單條件判斷盡量使用三目運算符: b?x:y.

  • 注意 List 等容器常用接口的復(fù)雜度, 盡量從尾部移除/批量移除(RemoveRange)等.

  • 在頻繁查詢數(shù)據(jù)列表時, 建議使用 HashSet/HashTable 查找時間復(fù)雜度低的數(shù)據(jù)結(jié)構(gòu), 避免使用 List.

  • 盡可能為快速產(chǎn)生和消滅的大量對象建立緩沖池.

  • 盡可能將類或函數(shù)聲明為 sealed, IL2CPP 會對 sealed 的類或函數(shù)進(jìn)行優(yōu)化, 變虛函數(shù)調(diào)用為直接函數(shù)調(diào)用.

  • 盡量減少new的次數(shù),預(yù)分配/成員變量替代臨時new變量等.

  • 最快的空串比較方法:最快的方法是str.Length == 0其次是str == String.Empty或str == "" 注:C#在編譯時會將程序集中聲明的所有字符串常量放到保留池中(intern pool),相同常量不會重復(fù)分配。(指的是這個"")

  • 減少Find方法使用。Find()方法會遍歷內(nèi)存中的每個GameObject和組件,隨著項目規(guī)模的擴(kuò)張,它的開銷將會越來越大。不要頻繁的使用Find()和與其類似的方法,可以考慮在Inspector中設(shè)置對對象的引用,或者創(chuàng)建一個專門用于管理需要搜索的對象的引用的腳本。

  • 避免使用Camera.main。 Camera.main 因此遭遇了和 Find() 一樣的問題:在內(nèi)存中搜索了所有的 GameObjects 和 Components,這個使用可能會消耗大。

  • 嘗試使用sqrMagnitude(即magnitude的平方)替代magnitude,減少開平方操作。

  • 盡量少用模運算和除法運算,比如a/5f,要寫成a*0.2f。

  • 盡量避免在運行時為Transforms重新設(shè)置parent。Unity對于在同一個parent下的所有Transforms,內(nèi)存排布是連續(xù)的類似動態(tài)數(shù)組,運行時重新設(shè)置parent可能會導(dǎo)致數(shù)組重新分配

  • 變量和字段如果可以聲明為const應(yīng)該總是被聲明為const,如果無法使用const,嘗試使用readonly

  • 二.其他規(guī)范和建議

  • 禁止非圖集貼圖資源不合理的留白. 會影響 UGUI 運行時自動合批.

  • 資源設(shè)置 UI 的貼圖資源禁止勾選 Generate Mip Maps.

  • 禁止使用修改 Alpha 值的方式來隱藏界面.

  • 盡可能降低 Release 版中圖集留白, 提高貼圖利用率.

  • 建議同一 Canvas 中使用到的圖集數(shù)量控制在三個以內(nèi).

  • 建立合理規(guī)劃公共圖集. 在內(nèi)存占用/加載頻度/引用復(fù)雜度之間確定合理的平衡點.

  • 禁止匿名 GrabPass. 如需使用到 GrabPass 必須命名并盡可能復(fù)用.

  • Shader中盡可能減少多 Pass 渲染, 除非必須這么做.

  • 盡可能降低 Release 版中 Shader 中的 Keyword 數(shù)量.

  • 盡可能降低 SkinnedMeshRenderer 組件數(shù)量.

  • 禁止逐幀直接使用名稱對 Shader Uniform 量進(jìn)行更新

  • 盡量避免在 Shader 中使用復(fù)雜的計算如: pow/sin/cos/tan/log 等.

  • 建議在 Shader 中采用預(yù)混合或?qū)崟r混合紋理的方式代替實時地多次紋理采樣

  • 移動平臺的 Shader 編碼一定要考慮數(shù)據(jù)精度(float/half/fixed)的合理使用.

  • 應(yīng)盡可能減少每幀 Material.GetXX/Material.SetXX的次數(shù), 比如把多個 uniform half 變量合并為 uniform half4.

  • 盡可能避免將 Animator 的 Culling Mode 屬性設(shè)置為 Always, 對于不使用 RootMotion 的項目建議選擇 CullCompletely.

  • 盡可能避免使用物理引擎. 建議自行編碼模擬物理效果

  • 使用物理模塊的游戲, 建議在 PhysicsManager 中設(shè)置矩陣, 會有較大的性能提升

  • 如使用第三方音頻插件, 需禁用 FMOD 模塊(Edit -> Project Settings -> Audio -> Disable -> UnityAudio).

  • 若不需要立體音效, 音頻導(dǎo)入設(shè)置需勾選 Force to Mono(注: 制作音頻時就應(yīng)該制作單通道的.)

  • 音頻格式: iOS平臺一般使用 mp3, Android平臺一般使用 ogg.

  • 無需由邏輯代碼訪問的渲染資源禁止勾選 Read/Write Enabled, 如網(wǎng)格和圖片.

  • 導(dǎo)入蒙皮網(wǎng)格模型時建議勾選 Optimize GameObject 優(yōu)化選項, 可極大地降低骨骼層次復(fù)雜度, 優(yōu)化 CPU 性能.

  • 無動作模型資源必須將 Animation Type 設(shè)置為 None, 否則會導(dǎo)致游戲?qū)ο髵煸诓槐匾膭赢嬆_本, 大量的話會嚴(yán)重影響 CPU 性能.

  • 導(dǎo)入的模型如果無需用到法線和切線, 必須將導(dǎo)入設(shè)置的 Normals 和 Tangents 選項設(shè)置為 None.

  • 導(dǎo)入的模型如果無需參與Unity Lightmap 烘焙, 必須將導(dǎo)入設(shè)置的 Generate Lightmap UVs 選項設(shè)置為 None.

  • 禁止在 Release 版中存在任何 OnGUI 相關(guān)代碼

  • 禁止在 Release 版中存在任何日常調(diào)試相關(guān)的 UnityEngine.DeBug 類日志輸出

  • 禁止在 Release 版中開啟 "Development Build" 和 "Script Debugging" 選項

  • 在發(fā)布時必須將游戲鎖定至合適的幀率(建議 30/60 幀)

  • 禁止在 Release 版中使用引擎提供的 SendMessage 方法.

  • ?

    總結(jié)

    以上是生活随笔為你收集整理的Unity游戏中的一些规范和优化建议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。