保存和解析枚举集合的最快方法

本文关键字:方法 集合 和解 枚举 保存 | 更新日期: 2023-09-27 18:29:51

在我创建的程序中,我有大量的枚举

enum kEvents
{
    Start = 0,
    End,
    EntityCreated,
}

在这个程序中,有一个庞大的实体列表。每个实体都有一个"kEvents"列表,它被"注册到"

每次一个对象说"调用开始事件"时,我都必须遍历游戏中的每个实体,看看他们是否在"监听"该事件。

注意:我知道c#有事件处理程序,但我希望从头开始创建这个枚举系统。

在这种情况下,什么是最好的方法:

  1. 在每个实体对象中保持枚举的集合
  2. 检查实体是否包含触发的枚举

我想知道基本上是数字的枚举是否有比对象的List<T>更低级别、更快的方法来处理这一问题。

保存和解析枚举集合的最快方法

每当一个物体说";调用开始事件";我必须迭代游戏中的每一个实体,并找出它们是否"是";"倾听";为该活动。

你做错了!对每个对象进行迭代并检查它们是否已注册为事件是非常低效的!这是典型的观察者设计模式,有几种方法可以实现这一点,这里有两种:

  1. 有一个单独的事件,该事件被引发并具有事件类型的枚举参数(每个订阅者都会得到它)
  2. 拥有枚举和相应事件的字典

以下是选项1可能的样子:

delegate void OnEventDelegate(kEvents anEvent);
public class MyEventObservable
{
    public event OnEventDelegate OnEvent;
}
public class MyEventObserver
{
    // Constructors and all
    // ...
    public void OnEventReceived(kEvents anEvent)
    {
        switch(anEvent)
        {
            // switch through all the events and handle the ones that you need
        }
    }
}
MyEventObserver observer = new MyEventObserver();
MyEventObservable observable = new MyEventObservable();
observable.OnEvent += new OnEventDelegate(observer.OnEventReceived);

这是选项2

public class MyEventObservable
{
    private Dictionary<kEvents, List<IObserver>> _observers;
    
    MyEventObservable()
    {
        // Initialize the dictionary with all the events
    }
    
    public void RegisterObserver(kEvents event, IObserver observer)
    {
        _observers[event].Add(observer);
    }
}
interface class IObserver
{    
    void Notify(kEvents anEvent);
}
public MyEventObserver: IObserver
{
    // Constructors and all
    // ...
    
    // Override the IObserver
    public void Notify(kEvents anEvent)
    {
        switch(anEvent)
        {
            // switch through all the events and handle the ones that you need
        }
    }
}
MyEventObserver observer = new MyEventObserver();
MyEventObservable observable = new MyEventObservable();
observable.RegisterObserver(kEvents.Start, observer);

选项二将减少每个观察者必须处理的事件数量,但这是以必须分别为每个事件注册为代价的(这增加了编码的复杂性)。这意味着选项2将更快地工作,因为要进行的函数调用更少。取决于";疯狂的";如果你想提高性能,可能还有其他选择可以帮助你加快速度,但这应该会让你走上正轨。

附言:我还没有编译任何代码,但它应该能让你大致了解事情应该如何工作。

在我看来,你想实现某种发布/订阅方案,一些集中的事件接收器,实体可以订阅事件,并在事件发生时提供回调,然后其他实体将上升事件,事件接收器将调用订阅该事件的所有实体。。。。但我可能不明白这个问题:)

类似于:

如何访问其他类中的控件

每次对象说"调用Start事件"时,我都必须迭代通过游戏中的每一个实体,找出它们是否"倾听"该事件。

如果我正确地理解了你在做什么,那么你就是在倒退。实体正在侦听哪些事件的知识不能(仅)在事件本身中。必须有另一个包含此信息的数据结构

其他数据结构可以是简单的东西,比如从枚举常量映射到实体列表。