Skip to main content
 首页 » 编程设计

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

2024年02月23日32xxx_UU

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

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

在这个程序中,有一个巨大的实体列表。 每个实体都有一个“已注册”的“kEvents”列表

每次对象说“调用 Start 事件”时,我都必须遍历游戏中的每个实体,并确定它们是否正在“监听”该事件。

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

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

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

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

请您参考如下方法:

Every time an object says "Call the Start event" I have to iterate through every single entity in the game, and find out if they are "listening" for that event.

你做错了!遍历每个对象并检查它们是否已注册事件是非常低效的!这是典型的 Observer design pattern有几种方法可以解决这个问题,这里有几个:

  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 会工作得更快,因为要进行的函数调用更少。根据您希望性能有多“疯狂”,可能还有其他选项可以帮助您加快速度,但这应该会让您走上正确的轨道。

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