開發代碼
-
編碼(Unity 引擎相關)
-
規范等級 S
100. 禁止通過 new 的方式實例化 MonoBehaviour 的派生類, 否則無法得到引擎的有效管理.
101. 禁止在 Update/FixedUpdate/LateUpdate/OnGUI 等頻繁調用的邏輯中使用協程.
102. 禁止使用 Resources.Load 加載資源, 個別情況除外.
103. 禁止使用 LINQ 表達式. -
規范等級 A
120. 禁止使用 Invoke("MethodA", 2) 來實現延時調用.
121. 禁止逐幀使用 Find/GetComponent 等引擎接口調用, 如有此類需求, 應該將結果緩存供后續使用.
122. 必須使用 GetInstanceID() 獲得的 int 值代替 UnityEngine.Object應用進行比較或作為散列表數據類型.
如 Dictionary 和 HashSet 的 key.
123. 當設置 GameObject 對象之間的父子關系時, 如果僅關注邏輯上的層次關系而無需保持子對象的空間方位, 則應該使用SetParent(parent, false) 避免空間轉換的性能消耗.
124. 代碼中需要訪問到 Transform 組件的位置數據時, 盡可能使用 localPosition 代替對 position 屬性的訪問.
125. 盡可能避免使用協程. Unity 的協程是使用迭代器實現的會分配堆內存.
126. 盡可能避免使用 MeshCollider 組件. 如有此類需求也應盡可能減少網格碰撞體的面數. 或使用 Sphere/Box/Capsule 的組合來代替.
127. 使用網格導航時, 應盡可能避免使用 Obstacle 模擬動態障礙物, 否則對 CPU 性能沖擊很大. 如有此類需求建議使用碰撞體代替. -
規范等級 B
140. 禁止使用接受字符串參數的 GetComponent 重載方法.
141. 禁止在 MonoBehaviour 的派生類中存在被引擎高頻調用的空方法, 如 Update里沒有方法內容就應該刪掉.
142. 禁止在 MonoBehaviour 的派生類中存在 Awake/Start/OnEnable/OnDestory 等空方法.
143. 必須使用 CompareTag 接口比較 GameObject的Tag.
144. 盡可能減少 UnityEngine.Object null 比較. -
規范等級 C
160. 建議合理使用 OnBecameVisible/OnBecameInvisible/OnWillRenderObject 類似的引擎回調以避免不必要的渲染和計算.
-
-
編碼(引擎無關)
-
規范等級 S
200. 必須對可能造成功能失效, 影響流程的代碼塊添加異常捕獲.
201. 禁止高頻的字符串拼接. 如無法避免, 必須使用 StringBuilder 代替 "+" 操作符進行字符串拼接. -
規范等級 A
220. 盡可能將 CPU 占用高的邏輯代碼分幀處理平攤 CPU 壓力.
221. 盡可能將計算量較大的運算放到子線程中進行, 避免阻塞主線程(如尋路等算法).
222. Delegate 回調方法必須適時的解除注冊, 否則回調方法所屬的對象會一直有引用計數, 繼而引起該對象所引用的資源無法得到釋放. -
規范等級 B
240. 盡量避免使用 Reflection(反射).
241. 盡量避免使用可變參數(param object[] args), 避免裝箱拆箱.
242. 禁止沒有計算需求的變量賦值或計算.
243. 簡單條件判斷盡量使用三目運算符: b?x:y.
244. 注意 List 等容器常用接口的復雜度, 盡量從尾部移除/批量移除(RemoveRange)等.
245. 在頻繁查詢數據列表時, 建議使用 HashSet/HashTable 查找時間復雜度低的數據結構, 避免使用 List.
246. 盡可能為快速產生和消滅的大量對象建立緩沖池. -
規范等級 C
260. 使用可變長容器時, 建議根據預估容量進行初始化.
261. 循環中尋找到符合條件后應該適時地使用 break 跳出循環.
262. 盡可能將一些內存占用低但為數眾多/功能簡單的小對象定義為 struct(結構體) 而非 class(類).
263. 盡可能減少函數調用棧, 如使用 x = (x > 0 ? x : -x); 代替 x = Mathf.Abs(x).
264. 盡可能將類或函數聲明為 sealed, IL2CPP 會對 sealed 的類或函數進行優化, 變虛函數調用為直接函數調用.
-
-
UI
-
規范等級 A
320. 禁止非圖集貼圖資源不合理的留白. 會影響 UGUI 運行時自動合批.
321. 資源設置 UI 的貼圖資源禁止勾選 Generate Mip Maps.
322. 禁止使用修改 Alpha 值的方式來隱藏界面.
323. 盡可能降低 Release 版中圖集留白, 提高貼圖利用率.
324. 盡可能將圖集中大的圖片改為底圖加載. -
規范等級 B
340. 建議同一 Canvas 中使用到的圖集數量控制在三個以內. -
規范等級 C
360. 建立合理規划公共圖集. 在內存占用/加載頻度/引用復雜度之間確定合理的平衡點.
-
-
渲染
-
規范等級 S
400. 禁止匿名 GrabPass. 如需使用到 GrabPass 必須命名並盡可能復用. -
規范等級 A
420. Shader中盡可能減少多 Pass 渲染, 除非必須這么做.
421. 盡可能降低 Release 版中 Shader 中的 Keyword 數量.
422. 盡可能降低 SkinnedMeshRenderer 組件數量. -
規范等級 B
440. 禁止逐幀直接使用名稱對 Shader Uniform 量進行更新.
441. 盡量避免在 Shader 中使用復雜的計算如: pow/sin/cos/tan/log 等.
442. 建議在 Shader 中采用預混合或實時混合紋理的方式代替實時地多次紋理采樣.
443. 移動平台的 Shader 編碼一定要考慮數據精度(float/half/fixed)的合理使用.
444. 應盡可能減少每幀 Material.GetXX/Material.SetXX的次數, 比如把多個 uniform half 變量合並為 uniform half4.
-
-
動畫
- 規范等級 B
540. 盡可能避免將 Animator 的 Culling Mode 屬性設置為 Always, 對於不使用 RootMotion 的項目建議選擇 CullCompletely.
- 規范等級 B
-
物理
- 規范等級 B
640. 盡可能避免使用物理引擎. 建議自行編碼模擬物理效果.
641. 使用物理模塊的游戲, 建議在 PhysicsManager 中設置矩陣, 會有較大的性能提升.
- 規范等級 B
-
音頻
-
規范等級 A
720. 如使用第三方音頻插件, 需禁用 FMOD 模塊(Edit -> Project Settings -> Audio -> Disable -> UnityAudio). -
規范等級 B
740. 若不需要立體音效, 音頻導入設置需勾選 Force to Mono(注: 制作音頻時就應該制作單通道的.)
-
-
資源
- 規范等級 A
820. 音頻格式: iOS平台一般使用 mp3, Android平台一般使用 ogg.
821. 無需由邏輯代碼訪問的渲染資源禁止勾選 Read/Write Enabled, 如網格和圖片.
822. 導入蒙皮網格模型時建議勾選 Optimize GameObject 優化選項, 可極大地降低骨骼層次復雜度, 優化 CPU 性能.
823. 無動作模型資源必須將 Animation Type 設置為 None, 否則會導致游戲對象掛在不必要的動畫腳本, 大量的話會嚴重影響 CPU 性能.
824. 導入的模型如果無需用到法線和切線, 必須將導入設置的 Normals 和 Tangents 選項設置為 None.
825. 導入的模型如果無需參與Unity Lightmap 烘焙, 必須將導入設置的 Generate Lightmap UVs 選項設置為 None.
- 規范等級 A
-
發包
-
規范等級 S
900. 禁止在 Release 版中存在任何 OnGUI 相關代碼.
901. 禁止在 Release 版中存在任何日常調試相關的 UnityEngine.DeBug 類日志輸出.
902. 禁止在 Release 版中開啟 "Development Build" 和 "Script Debugging" 選項.
903. 在發布時必須將游戲鎖定至合適的幀率(建議 30/60 幀) -
規范等級 A
921. 禁止在 Release 版中使用引擎提供的 SendMessage 方法.
-