考虑这段代码:
class GameEventsManager
{
public void StartGameEvent(GameEvent TheGameEvent)
{
SubscribeToGameEvent(TheGameEvent);
TheGameEvent.Begin();
UnsubscribeToGameEvent(TheGameEvent);
}
private void SubscribeToGameEvent(GameEvent TheGameEvent)
{
TheGameEvent.OnPlaySound += OnPlaySound;
TheGameEvent.OnShowWrittenItem += OnShowWrittenItem;
...
}
private void UnsubscribeToGameEvent(GameEvent TheGameEvent)
{
TheGameEvent.OnPlaySound -= OnPlaySound;
TheGameEvent.OnShowWrittenItem -= OnShowWrittenItem;
...
}
}
GameEvent 是一个基本上执行此操作的类:当 Begin() 被调用时,它会引发传递给 GameEventManager 的事件,以便它可以“做出”对游戏环境的适当更改(这是通过进一步将事件传播到负责执行每个特定指令的对象,如观察者模式中的对象)。
现在考虑到我所有的 InventoryItem(可以触发事件,例如 OnConsume、OnUse)都是其特定类中的静态字段。虽然这看起来有点粗糙,但我觉得能够做到:
AddItem(WrittenItems.NoteFromKing) //NoteFromKing is a static field in WrittenItems
让事情变得更简单,考虑到我正在开发一款非常复杂的游戏,这是一个受欢迎的景象。
然而,这让我很难在某处列出所有游戏项目,以防万一。这让我们想到了我的问题:
LevelManager 管理诸如玩家何时与关卡中的特定项目交互等事情,如果需要,它会告诉 GameEventsManager 运行特定的 GameEvent。GameEventsManager 然后订阅 GameEvent,启动它,然后取消订阅。在遵循此订阅/运行/取消订阅模式时,我是否应该期望看到明显的性能问题?最后,经理可能会订阅/取消订阅 GameEvent 中的大约 20 个事件。
如果订阅/取消订阅机制很慢,我可以创建一个在游戏初始化时运行的订阅过程,但这会迫使我构建一个额外的结构,以列出所有项目。
所以,简而言之,我想知道我是否应该期待这种实施会出现相当大的放缓。或者更准确地说,如果订阅大约 20 个事件,然后取消订阅它们会相当慢。
语言为 C#,使用 Unity 4 下的 .NET 2.0 子集。