Switch case 跟 If-Else

優化自己內碼時發現的奇怪現像….
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
Switch-case result
Switch-case result
If-Else
If-Else result
If-Else result
在這專案裡多佔用的 120B 就是 If-else 的佔用資源, 當然不是單單一個 If else, 是總量.
之後查一下資料才發現經常被老手唾罵的 Swtich-case 原來在高使用量的時候效果非常好,
這專案大部份輸入運算是使用 FixUpdate, 其他顯示則使用 LateUpdate 跟 Update.
其後查找到這部份的詳細資料以作參考.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料