背景:我的游戏使用的是组件系统。我有一个Entity
类,其中有一个IComponent
实例列表List<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 循环更有效。这里发生了什么?