【发布时间】:2012-12-03 12:53:15
【问题描述】:
背景:我的游戏使用的是组件系统。我有一个Entity 类,它在List<IComponent> 中有一个IComponent 实例列表。我目前对Entity.GetComponent<T>() 的实现是:
return (T)this.components.Single(c => c is T);
添加碰撞检测后,我注意到我的游戏降到了 1FPS。分析显示罪魁祸首就是这个调用(每帧调用 3000 多次)。
除了 3000x 之外,我注意到调用这 300k 次大约需要 2 秒。我将其优化为一个简单的迭代循环:
foreach (IComponent c in this.components) {
if (c is T) {
return (T)c;
}
}
return default(T);
此代码现在运行时间约为 0.4 秒,快了一个数量级。
我认为Single 会比单个 foreach 循环更有效。这是怎么回事?
【问题讨论】:
-
你可以用 FirstOrDefault 替换 Single ,它只会返回第一次出现,应该和你的迭代循环一样快
-
如果你更喜欢抽象出铸件,你可以像这样使用
OfType<T>():return this.components.OfType<T>().FirstOrDefault(); -
感谢 Martheen 和 @RiskyMartin,我会采纳您的建议。
标签: c# linq optimization