保存和解析枚举集合的最快方法
本文关键字:方法 集合 和解 枚举 保存 | 更新日期: 2023-09-27 18:29:51
在我创建的程序中,我有大量的枚举
enum kEvents
{
Start = 0,
End,
EntityCreated,
}
在这个程序中,有一个庞大的实体列表。每个实体都有一个"kEvents"列表,它被"注册到"
每次一个对象说"调用开始事件"时,我都必须遍历游戏中的每个实体,看看他们是否在"监听"该事件。
注意:我知道c#有事件处理程序,但我希望从头开始创建这个枚举系统。
在这种情况下,什么是最好的方法:
- 在每个实体对象中保持枚举的集合
- 检查实体是否包含触发的枚举
我想知道基本上是数字的枚举是否有比对象的List<T>
更低级别、更快的方法来处理这一问题。
每当一个物体说";调用开始事件";我必须迭代游戏中的每一个实体,并找出它们是否"是";"倾听";为该活动。
你做错了!对每个对象进行迭代并检查它们是否已注册为事件是非常低效的!这是典型的观察者设计模式,有几种方法可以实现这一点,这里有两种:
- 有一个单独的事件,该事件被引发并具有事件类型的枚举参数(每个订阅者都会得到它)
- 拥有枚举和相应事件的字典
以下是选项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事件"时,我都必须迭代通过游戏中的每一个实体,找出它们是否"倾听"该事件。
如果我正确地理解了你在做什么,那么你就是在倒退。实体正在侦听哪些事件的知识不能(仅)在事件本身中。必须有另一个包含此信息的数据结构。
其他数据结构可以是简单的东西,比如从枚举常量映射到实体列表。