小编Dar*_*rcy的帖子

List.Clear(); vs List <T> = new List <T>(); 垃圾收集性能

我正在开发一个带有大量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()时,我的垃圾收集量大大减少了.以下是我用来试图了解我的列表项中发生的事情的链接.

.net c# garbage-collection list

3
推荐指数
1
解决办法
530
查看次数

标签 统计

.net ×1

c# ×1

garbage-collection ×1

list ×1