记忆中的物体和一般内存管理

时间:2013-11-28 05:17:05

标签: c# memory xna monogame

我在掌握与记忆中物体有关的一些概念时遇到困难,如果有人能让我走上正轨,我将非常感激。我意识到管理内存是多么重要,我担心我会采用糟糕的编程习惯。

在我的游戏循环中,我使用以下格式的lambda表达式从我的游戏中删除对象:

ObjectsMan.lstExplosionParticles.RemoveAll(particle => particle.TTL <= 0);

这些对象通常在列表添加方法中实例化,例如:

ObjectsMan.EnemyShots.Add(new EnemShot(current.SpritePosition + position.Key, 
Logic_ReturnValue.Angle_TarPlayer(current), position.Value));

据我所知,该列表存储了对象的内存位置。因此,当我从列表中删除它时,该对象仍然存在于内存中。那是对的吗?

如果情况确实如此,即使我没有画出它们,这些物体中的许多物体是否会导致游戏滞后(例如,数以千计的个体射弹物体)?我是否需要手动将每个对象分配为空?

另外,如果我没有对我的游戏绘制方法施加帧速率上限,我是否认为由于人眼无法看到的框架而导致我失去了大量的性能?

另一个问题是,如果我使用调试器停止游戏并播放声音,我的声音驱动程序会锁定。我认为调用我的声音效果的Stop方法会阻止这种情况。调试器在停止时是否绕过XNA的卸载内容方法?这里发生了什么?

最后,如果我包含我在技术上不需要的额外使用语句,那是否会影响我的记忆?例如,我的大多数类都包含一些他们实际上不需要的使用语句。是否有与性能相关的理由来清理它,还是仅仅是良好的编程习惯?

如果有人能给我一些帮助或指出我正确的方向,我将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:3)

  

据我所知,该列表存储了对象的内存位置。因此,当我从列表中删除它时,该对象仍然存在于内存中。这是对的吗?

是。您只是删除了对象的引用。

  

如果情况确实如此,那么即使我没有画出它们,许多这些物体是否会导致游戏滞后(例如,成千上万的个体射弹物体)呢?

直接?不,但是当GC最终开始时,它们将导致滞后。仅仅因为GC有更多的物体可以照顾。我在Xbox360上遇到了完全相同的问题,没有世代GC。

  

我是否需要手动将每个对象分配为空?

这只是删除引用。与从列表中删除它相同。

  

最后,如果我包含我在技术上不需要的额外使用语句,那是否会影响我的记忆?例如,我的大多数类都包含一些他们实际上不需要的使用语句。是否有与性能相关的理由来清理它,还是仅仅是良好的编程习惯?

这里应该没有问题。

  

GC在程序结束前没有启动,这是正确的吗?

错误。 GC可以在任何时间点运行。通常,如果应用程序决定内存不足而操作系统无法提供任何内存,则它将运行GC。

  

仅仅因为我从列表中删除了对象,这不应该让GC有理由从内存中删除我的对象吗?

如果此列表仅包含引用,则GC可以自由删除该对象。但如果GC实际上是在那一刻运行的话,则无关紧要。

此外,通常,在编写游戏时,您应该限制您创建的对象数量。仅仅因为运行GC会产生大量不可预测的延迟。使用结构或重用现有实例。在粒子系统的情况下,最好的方法是为每个粒子和场提供结构,说明粒子是否有效。删除粒子时,只需将此字段设置为false即可。添加新粒子时,首先会找到不活动的粒子并设置相应的字段并激活它。