我正在开发一个带有大量AI的游戏,并注意到我的垃圾收集器每秒收集3-4次物体,这真的会伤害性能并在帧速率下降之前将敌人的数量限制在120.我分析了代码并发现罪魁祸首是我的碰撞检测代码,其中我有一个函数被调用多次,一个帧生成一个投影到轴上的列表.代码就像
public List<Vector2> foo()
{
List<Vector2> projections = new List<Vector2>();
// Calculate and return projections
}
Run Code Online (Sandbox Code Playgroud)
还有一些其他函数也在每次调用时创建新列表,并且我每个函数调用都会生成新列表,支持将一个vector2s列表存储为类的字段,这样我就不会调用每个函数的新列表呼叫.这将垃圾收集呼叫从每秒3-4次减少到每10-20秒一次,这使得我可以在帧率下降之前在地图上获得400-500个敌人.
新功能看起来像:
public List<Vector2> foo()
{
// projections is now a field of this class so we just clear it each function call
projections.Clear();
// Calculate and return projections
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么List.Clear方法比List = new List()招致更少的垃圾收集?当你调用clear时,我已经对列表中的项发生了什么进行了一些研究,当它们没有引用时看起来好像它们应该被垃圾收集,所以我的项目正在函数内创建,所以当函数退出时并且下次调用清除列表,以前的项目是否也应该被垃圾收集?
我的理解是,清除的项目应该是垃圾收集,就像我调用List = new List一样.很明显,当我切换到List.Clear()时,我的垃圾收集量大大减少了.以下是我用来试图了解我的列表项中发生的事情的链接.