XNA中Game.Services.GetService()的效率

XNA中Game.Services.GetService()的效率,xna,Xna,从本质上讲,我试图找出是否应该存储对检索到的服务的引用,或者是否可以在每次需要时调用GetService SpriteBatch就是一个很好的例子。我调用 SpriteBatch spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch)); 在每个需要它的Draw()方法的开头 总之,GetService()的最大优点是什么?这将帮助我做出决定。我假设它是一个哈希表,所以一般来说O(1)?不能说我对

从本质上讲,我试图找出是否应该存储对检索到的服务的引用,或者是否可以在每次需要时调用GetService

SpriteBatch就是一个很好的例子。我调用

    SpriteBatch spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch)); 
在每个需要它的Draw()方法的开头


总之,GetService()的最大优点是什么?这将帮助我做出决定。我假设它是一个哈希表,所以一般来说O(1)?

不能说我对
GetService
的渐进效率一无所知,但显而易见的是,它比维护对象的引用要慢。至少,这应该是显而易见的,因为引用只是坐在那里等待使用,而
GetService
需要从类中检索
Type
实例,然后在使用的任何集合中查找该
Type
,最后强制转换为正确的类型,引发运行时检查等

就个人而言,这些都不是问题。即使在一起,只要使用几次,它们都不是问题。但是,看看您是如何在每帧的基础上检索这些服务的,影响可能会变得明显,这取决于您检索每个帧的服务数量


基于我所掌握的关于代码的少量信息,我想说更改为引用选项应该不会那么难。但是,要真正决定是否值得,可以尝试切换到保留一个参考(至少对于一些服务),并检查您的FPS变化有多大。或者,抛出一些无关的
GetService
调用,看看它会导致FPS下降多少。这将是一种更明确的方式来发现改变一切的重要性。

不能说我知道关于
GetService
的渐进效率的任何信息,但显而易见的是,它比维护对对象的引用要慢。至少,这应该是显而易见的,因为引用只是坐在那里等待使用,而
GetService
需要从类中检索
Type
实例,然后在使用的任何集合中查找该
Type
,最后强制转换为正确的类型,引发运行时检查等

就个人而言,这些都不是问题。即使在一起,只要使用几次,它们都不是问题。但是,看看您是如何在每帧的基础上检索这些服务的,影响可能会变得明显,这取决于您检索每个帧的服务数量


基于我所掌握的关于代码的少量信息,我想说更改为引用选项应该不会那么难。但是,要真正决定是否值得,可以尝试切换到保留一个参考(至少对于一些服务),并检查您的FPS变化有多大。或者,抛出一些无关的
GetService
调用,看看它会导致FPS下降多少。这将是一种更明确的方式来发现改变一切的重要性。

GetService的大O是不相关的,因为其中包含的服务数量很少且恒定。因此,有效地调用
GetService
是一个固定时间的O(1)操作。(在内部,它使用了一本
字典
——我无法轻易找到关于它的Big-O的明确答案,但我认为它相当不错)

它是否比获得参考资料慢很多是。

对于一个拥有100个游戏对象的游戏世界来说,它是否太慢了编号

对于粒子系统中的100000个粒子来说,速度是否太慢?对


使用服务体系结构是一个坏主意,即使忽略性能,只考虑体系结构的观点? GetService的Big-O是不相关的,因为其中包含的服务数量很少且恒定。因此,有效地调用

GetService
是一个固定时间的O(1)操作。(在内部,它使用了一本
字典
——我无法轻易找到关于它的Big-O的明确答案,但我认为它相当不错)

它是否比获得参考资料慢很多是。

对于一个拥有100个游戏对象的游戏世界来说,它是否太慢了编号

对于粒子系统中的100000个粒子来说,速度是否太慢?对


使用服务体系结构是一个坏主意,即使忽略性能,只考虑体系结构的观点? 如果SpriteBatch的这个实例是您在整个模拟过程中需要的,我认为您应该将它存储在服务中。我认为,如果您正确使用GameServiceContainer,就不必担心速度问题。 例如:在我的模拟中,我有大约20个游戏服务,这些服务必须提供给许多游戏组件。这些服务中的大多数是在调用Initialize()时从服务中提取的,因为实例在运行时不会更改。唯一可能改变的服务(在我的模拟中)是ICamera和IGlobalLight。因此,这些是从每个Draw()上的服务提取的唯一引用


最后,我认为性能开销是值得的,与“体系结构解决方案”相比,比如超级全局变量或使所有服务成为单例

如果SpriteBatch的这个实例是您在整个模拟过程中需要的,我认为您应该将它存储在服务中。我认为,如果您正确使用GameServiceContainer,就不必担心速度问题。 例如:在我的模拟中,我有大约20个游戏服务,这些服务必须提供给许多游戏组件。这些服务中的大多数都是在调用Initialize()时从服务中提取的,因为实例在初始化期间不会更改