This repository has been archived on 2025-09-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
XericLibrary-OLD/Runtime/MicroLibrary/MacroEvent.cs
T
lrss3 3b8bf5a940 移除了影响打包的部分;
修正了洗牌算法中的错误;
将弱类型中历史记录的功能拆开了,减小了不必要的消耗;
2023-11-01 16:31:58 +08:00

98 lines
2.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor.Experimental.GraphView;
#endif
using System.Runtime.CompilerServices;
using Xorti = XericLibrary.Runtime.MacroLibrary.MacroMath;
using UnityEngine;
namespace XericLibrary.Runtime.MacroLibrary
{
public static class MacroEvent
{
#region 控制器
/// <summary>
/// 保守事件控制器
/// </summary>
class ConservativeManager
{
#region 字段属性
/// <summary>
/// 事件索引器
/// </summary>
private Dictionary<int, int> EventIndex;
/// <summary>
/// 事件状态寄存器
/// </summary>
private List<int> eventRegister;
#endregion
#region 方法
public ConservativeManager()
{
EventIndex = new Dictionary<int, int>();
eventRegister = new List<int>();
}
/// <summary>
/// 保守地利用控制器调用一个事件分发器
/// </summary>
public void InvokeConservative(Delegate targetevent)
{
var code = targetevent.GetHashCode();
int index = 0;
if(!EventIndex.TryGetValue(code, out index))
EventIndex.Add(code, EventIndex.Count);
targetevent.DynamicInvoke();// dynmic代表动态类型,包含装箱拆箱,速度会非常慢
}
#endregion
}
#endregion
#region 事件
/// <summary>
/// 保守地调用一个事件分发器
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool InvokeConservative(this Action invokedEvent, int sign, ref int register)
{
if(Xorti.GetByteState(register, sign))
return false;
Xorti.SetByteState(ref register, sign, true);
invokedEvent?.Invoke();
Xorti.SetByteState(ref register, sign, false);
return true;
}
/// <summary>
/// 保守地调用一个事件分发器
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool InvokeConservative<PARAM>(this Action<PARAM> invokedEvent, PARAM input, int sign, ref int register)
{
if(Xorti.GetByteState(register, sign))
return false;
Xorti.SetByteState(ref register, sign, true);
invokedEvent?.Invoke(input);
Xorti.SetByteState(ref register, sign, false);
return true;
}
#endregion
}
}