我没有编写游戏大约10年(我的最后一次经历是DJGPP + Allegro),但我想我会在周末看看XNA,看看它是如何形成的.
我印象非常深刻,但是当我继续拼凑游戏引擎时,我有一个(可能)基本问题.
您应该依靠C#的代表和活动来推动游戏多少?作为应用程序程序员,我大量使用委托和事件,但我不知道这样做是否有很大的开销.
在我的游戏引擎中,我设计了一种"追逐凸轮",它可以附加到一个物体上,然后重新计算它相对于物体的位置.当对象移动时,有两种方法可以更新追逐凸轮.
在主游戏循环中有一个"UpdateCameras()"方法.
使用事件处理程序,并使chase cam订阅object.OnMoved.
我正在使用后者,因为它允许我将事件链接在一起并很好地自动化引擎的大部分.突然之间,巨大而复杂的东西会落到少数3-5线事件处理程序中......这是一种美.
但是,如果每纳秒触发的事件处理程序变成一个主要的减速,我将删除它并采用循环方法.
想法?
如果您将某个事件视为订阅者列表,则在您的代码中,您所做的只是注册订阅者.在CLR级别,实现这一目标所需的指令数量可能很少.
如果您希望代码是通用的或动态的,那么您需要在调用事件之前检查是否订阅了某些内容.C#和.NET的事件/委托机制以极低的成本(就CPU而言)为您提供.
如果您真的关心每个时钟周期,那么您永远不会编写通用/动态游戏逻辑.这是可维护/可配置代码与直接速度之间的权衡.
写得好,我赞成事件/代表,直到我能证明这是一个问题.
你真正知道它是否是一个问题的唯一方法是分析你的代码 - 无论如何你应该为任何游戏开发做什么!