【问题标题】:C# delegate performance in xna gamexna 游戏中的 C# 委托性能
【发布时间】:2010-07-09 13:21:49
【问题描述】:

我目前正在开发一个 C# .net xna 游戏引擎。

我一直在尝试找到一种方法来拥有更新管理器/调度程序/事件系统。我目前正在使用委托来提供一种创建动态计划任务和事件的方法。

我最近读到代表可能会很慢。我的游戏中的代理每帧都会被调用,我想知道这是否会影响性能?

更新:

我也刚刚发现了这个http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

这就是我担心的问题,我想有办法解决它。感谢您提供所有其他信息。

【问题讨论】:

  • 写一个小微基准,找出自己?
  • 关于您的更新 - 只是不要每 1/60 秒重新创建代表。但是,即使您这样做了,实例也将全部位于堆上的 Gen0 中,并且 GC 在收集 Gen0 方面非常有效。
  • @codekaizen 除了Xbox上的GC不是分代的!
  • @Andrew - 什么!?我认为它与 Compact Framework 的运行时相同……哦,为什么,它是一个“标记和清除”收集器!我不知道...

标签: c# performance xna game-engine


【解决方案1】:

不用担心 - 委托比常规函数调用稍慢,但除非你每秒调用数百万次,否则我非常怀疑你会注意到。

我建议坚持使用代表,除非它被证明是一个瓶颈。

【讨论】:

  • 是的,他们每秒最多只能被调用 60 次
  • 只有60次/秒会有微秒的差异。如果是 6000 次/秒,我怀疑您是否会注意到委托和函数之间的差异。
  • @Chris 是的,如果是每秒 60 次,那么性能影响将完全可以忽略不计。如果代表工作并保持代码简单和可维护,那就去吧。
  • 好的,非常感谢。这正是我希望听到的 =)
【解决方案2】:

不管是否可以影响性能,更好的问题是是否存在性能影响。您应该在有和没有委托的情况下测量应用程序的性能,以确定任何性能损失是否可以接受。

【讨论】:

  • 我会这样做并让你知道
【解决方案3】:

委托与直接方法调用相比,显然有一些性能问题,但在现代(阅读:v1.1 后)版本的 CLR 中,它与通过接口的方法调用差不多快。

这是一个粗略的性能指标表: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

与往常一样,您应该衡量您是否可以接受性能。由于我在性能关键代码(动画)中使用了委托并且没有遇到问题,我希望它对您来说没问题。

【讨论】:

    【解决方案4】:

    您的猜测(以及我们的猜测)并不准确,也不一定与您游戏的实际表现相符。了解实际性能影响的唯一方法是至少进行一种分析。 Why measure when you can guess?

    除了对您的表现进行实际衡量之外,请考虑:这是否重要?如果你的游戏以 60fps 运行(我什至喜欢在快节奏的游戏中以 30fps 的速度运行,如果它更慢,我可以处理低至 20fps 的速度,比如回合制游戏)并且你能够在可变时间内达到 300fps -step 模式,并且代表会花费您整整 20 帧(顺便说一下,他们可能不会)...您的游戏在固定时间步长模式下仍然可以保持 60fps。

    【讨论】:

      【解决方案5】:

      我将在这里回应其他所有人的回答,因为代表不是问题,除非他们是问题——分析员是你的朋友。

      需要注意的一点可能是一个问题,如果您在每一帧都重新创建代理 - 在这种情况下,您可能会产生过多的垃圾,这会降低您的性能.但是,请先使用 CLR 分析器之类的工具来确定这是否对您来说是个问题。

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多