gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:15 26 4
gpt4 key购买 nike

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

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

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

关于c# - 保存和解析枚举集合的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com