優化自己內碼時發現的奇怪現像….
CameraBot 專案裡頭為了方便經常使用 Switch-case, 其結果竟然比 If-else 更快
以這段為例:
(If-Else 跟 Switch-case 處理結果相同…)
private void UpdateCameraPosition(Preset preset) { if (ControlPosition == null) return; float time = Time.deltaTime * preset.Method.PositionSpeed; #if UseIfElse ControlPosition.position = (preset.Method.MoveMethod.Equals(MoveMethod.QuaternionLerp)) ? Vector3.Slerp(ControlPosition.position, preset.Cache.CameraFinalPosition, time) : (preset.Method.MoveMethod.Equals(MoveMethod.lerp)) ? Vector3.Lerp(ControlPosition.position, preset.Cache.CameraFinalPosition, time) : preset.Cache.CameraFinalPosition; #elif UseSwitchCase switch (preset.Method.MoveMethod) { default: case MoveMethod.Snap: ControlPosition.position = preset.Cache.CameraFinalPosition; break; case MoveMethod.lerp: ControlPosition.position = Vector3.Lerp(ControlPosition.position, preset.Cache.CameraFinalPosition, time); break; case MoveMethod.QuaternionLerp: ControlPosition.position = Vector3.Slerp(ControlPosition.position, preset.Cache.CameraFinalPosition, time); break; } #endif }
執行的結果.
Switch-Case
If-Else
在這專案裡多佔用的 120B 就是 If-else 的佔用資源, 當然不是單單一個 If else, 是總量.
之後查一下資料才發現經常被老手唾罵的 Swtich-case 原來在高使用量的時候效果非常好,
這專案大部份輸入運算是使用 FixUpdate, 其他顯示則使用 LateUpdate 跟 Update.
其後查找到這部份的詳細資料以作參考.