背景:私のゲームはコンポーネントシステムを使用しています。にインスタンスのリストがある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ループよりもはるかに効率的だと思いました。何が起きてる?