94 lines
2.4 KiB
C#
94 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class UpdateManager : MonoBehaviour
|
|
{
|
|
public enum UpdateMode
|
|
{
|
|
BucketA = 0,
|
|
BucketB = 1,
|
|
Always = 2
|
|
}
|
|
|
|
private readonly HashSet<IBatchUpdate> _slicedUpdateBehavioursBucketA = new HashSet<IBatchUpdate>();
|
|
|
|
private readonly HashSet<IBatchUpdate> _slicedUpdateBehavioursBucketB = new HashSet<IBatchUpdate>();
|
|
|
|
private readonly HashSet<IBatchFixedUpdate> _slicedFixedUpdateBehaviours = new HashSet<IBatchFixedUpdate>();
|
|
|
|
private bool _isCurrentBucketA;
|
|
|
|
public static UpdateManager Instance { get; private set; }
|
|
|
|
public static void RegisterSlicedUpdate(IBatchUpdate slicedUpdateBehaviour, UpdateMode updateMode)
|
|
{
|
|
if (Instance == null)
|
|
{
|
|
new GameObject("UpdateManager", typeof(UpdateManager));
|
|
}
|
|
HashSet<IBatchUpdate> hashSet;
|
|
switch (updateMode)
|
|
{
|
|
case UpdateMode.Always:
|
|
Instance._slicedUpdateBehavioursBucketA.Add(slicedUpdateBehaviour);
|
|
Instance._slicedUpdateBehavioursBucketB.Add(slicedUpdateBehaviour);
|
|
return;
|
|
default:
|
|
hashSet = Instance._slicedUpdateBehavioursBucketB;
|
|
break;
|
|
case UpdateMode.BucketA:
|
|
hashSet = Instance._slicedUpdateBehavioursBucketA;
|
|
break;
|
|
}
|
|
hashSet.Add(slicedUpdateBehaviour);
|
|
}
|
|
|
|
public static void DeregisterSlicedUpdate(IBatchUpdate slicedUpdateBehaviour)
|
|
{
|
|
Instance._slicedUpdateBehavioursBucketA.Remove(slicedUpdateBehaviour);
|
|
Instance._slicedUpdateBehavioursBucketB.Remove(slicedUpdateBehaviour);
|
|
}
|
|
|
|
public static void RegisterSlicedFixedUpdate(IBatchFixedUpdate slicedUpdateBehaviour)
|
|
{
|
|
if (Instance == null)
|
|
{
|
|
new GameObject("UpdateManager", typeof(UpdateManager));
|
|
}
|
|
Instance._slicedFixedUpdateBehaviours.Add(slicedUpdateBehaviour);
|
|
}
|
|
|
|
public static void DeregisterSlicedFixedUpdate(IBatchFixedUpdate slicedUpdateBehaviour)
|
|
{
|
|
Instance._slicedFixedUpdateBehaviours.Remove(slicedUpdateBehaviour);
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
if (Instance != null)
|
|
{
|
|
Object.DestroyImmediate(base.gameObject);
|
|
return;
|
|
}
|
|
Instance = this;
|
|
Object.DontDestroyOnLoad(base.gameObject);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
foreach (IBatchUpdate item in _isCurrentBucketA ? _slicedUpdateBehavioursBucketA : _slicedUpdateBehavioursBucketB)
|
|
{
|
|
item.BatchUpdate();
|
|
}
|
|
_isCurrentBucketA = !_isCurrentBucketA;
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
foreach (IBatchFixedUpdate slicedFixedUpdateBehaviour in _slicedFixedUpdateBehaviours)
|
|
{
|
|
slicedFixedUpdateBehaviour.BatchFixedUpdate();
|
|
}
|
|
}
|
|
}
|