5

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

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

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

更新:

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

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

4

5 回答 5

8

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

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

于 2010-07-09T00:36:33.793 回答
1

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

于 2010-07-09T00:35:48.250 回答
1

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

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

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

于 2010-07-09T00:39:15.893 回答
1

您的猜测(以及我们的猜测)并不准确,也不一定与您游戏的实际表现相符。了解实际性能影响的唯一方法是至少进行一种分析。为什么要在你能猜到的时候测量?

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

于 2010-07-09T01:22:45.503 回答
1

我将在这里回应其他所有人的答案,因为除非代表有问题,否则代表不是问题——分析器是您的朋友。

One thing to watch out for that could be a problem is if you are re-creating the delegates every frame -- in which case, you could be generating excess garbage, which will reduce your performance. However, use tools like the CLR profiler to determine first if this is a problem for you.

于 2010-07-09T05:10:20.203 回答