c# - 游戏编程和事件处理程序

标签 c# xna camera

我已经有大约 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/

相关文章:

c# - 如何在 C# 中将大的多行文本分配给字符串?

c# - 判断一个TCP流是否已经断开

c# - 在循环中使用 NUnit Assert 时,如何在错误消息中显示更多信息?

c# - 从 2D 到 3D 的运动

c# - 个人项目计划

c# - 偶尔 10 毫秒的延迟是否适合 60 fps?

android - android MediaRecorder 的 IllegalStateException

php - 干预图像 - 如何上传 MIME 类型为 : application/octet-stream 的图像

ios - 如何立即将照片保存到相机胶卷

c# - 我们应该始终明确指定 ToString() 吗?