我已经有大约 10 年没有编写游戏程序了(我上一次的经验是 DJGPP + Allegro),但我想我会在周末检查一下 XNA,看看它是如何形成的。
给我留下了深刻的印象,但是当我继续拼凑游戏引擎时,我有一个(可能)基本问题。
您应该在多大程度上依赖 C# 的委托(delegate)和事件来驱动游戏?作为一名应用程序程序员,我大量使用委托(delegate)和事件,但我不知道这样做是否会产生重大开销。
在我的游戏引擎中,我设计了一种“追逐摄像机”,它可以附加到一个物体上,然后重新计算它相对于物体的位置。当物体移动时,有两种方式更新跟踪凸轮。
- 在主游戏循环中有一个“UpdateCameras()”方法。
- 使用事件处理程序,并让追踪摄像头订阅 object.OnMoved。
我正在使用后者,因为它允许我将事件链接在一起并很好地自动化引擎的大部分。突然间,庞大而复杂的内容被简化为少数 3-5 行事件处理程序......这真是太美了。
但是,如果每纳秒触发一次的事件处理程序被证明是一个重大的减速,我将删除它并采用循环方法。
想法?
最佳答案
如果您将事件视为订阅者列表,那么在您的代码中您所做的就是注册订阅者。实现这一目标所需的指令数量在 CLR 级别可能是最少的。
如果您希望您的代码是通用的或动态的,那么您需要在调用事件之前检查是否订阅了某些内容。 C# 和 .NET 的事件/委托(delegate)机制以极低的成本(就 CPU 而言)为您提供了这一点。
如果您真的关心每个时钟周期,就永远不会编写通用/动态游戏逻辑。这是可维护/可配置代码与绝对速度之间的权衡。
写得很好,我会支持事件/代表,直到我能证明这是一个问题。
您真正了解这对您来说是否是个问题的唯一方法是分析您的代码——对于任何游戏开发,您都应该这样做!
关于c# - 游戏编程和事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63960/