2

考虑这段代码:

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 子集。

4

1 回答 1

0

然而,这让我很难在某处列出所有游戏项目

为什么这样?您可以创建一个 ItemManager (这是一个单例):

public class ItemManager
{
    private static volatile ItemManager _instance;
    private static object syncRoot = new Object();

    private ObservableCollection<ItemBase> _registeredItems = new ObservableCollection<ItemBase>();
    private ItemManager()
    {
    }

    public ItemManager Instance
    {
        get
        {
             if (instance == null) 
             {
                 lock (syncRoot) 
                 {
                     if (instance == null) 
                         instance = new ItemManager();
                 }
             } 
             return instance;
        }
    }

    public void RegisterItem(ItemBase item)
    {
        _registeredItems.Add(item);
        // Do some stuff here, subscribe events, etc.
    }

    public void UnregisterItem(item)
    {
        // Do some stuff here, unregister events, etc.
        _registeredItems.Remove(item)
    }

}

之后,您使所有项目类派生自一个名为“ItemBase”的类。在 ItemBases 构造函数中,你称之为:

ItemManager.Instance.RegisterItem(this);

因此,您不必手动添加每个项目。有关单例模式的更多信息,请查看此处:http: //msdn.microsoft.com/en-us/library/ff650316.aspx

这样做的一个小好处是,您可以实现 GameManager 和 ItemManager 之间的一般通信。

于 2013-01-01T17:14:29.330 回答