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
LiRuoChen 3b8bf5a940 移除了影响打包的部分;
修正了洗牌算法中的错误;
将弱类型中历史记录的功能拆开了,减小了不必要的消耗;
2023-11-01 16:31:58 +08:00

98 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}