我在掌握与记忆中物体有关的一些概念时遇到困难,如果有人能让我走上正轨,我将非常感激。我意识到管理内存是多么重要,我担心我会采用糟糕的编程习惯。
在我的游戏循环中,我使用以下格式的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的卸载内容方法?这里发生了什么?
最后,如果我包含我在技术上不需要的额外使用语句,那是否会影响我的记忆?例如,我的大多数类都包含一些他们实际上不需要的使用语句。是否有与性能相关的理由来清理它,还是仅仅是良好的编程习惯?
如果有人能给我一些帮助或指出我正确的方向,我将不胜感激。
感谢。
答案 0 :(得分:3)
据我所知,该列表存储了对象的内存位置。因此,当我从列表中删除它时,该对象仍然存在于内存中。这是对的吗?
是。您只是删除了对象的引用。
如果情况确实如此,那么即使我没有画出它们,许多这些物体是否会导致游戏滞后(例如,成千上万的个体射弹物体)呢?
直接?不,但是当GC最终开始时,它们将导致滞后。仅仅因为GC有更多的物体可以照顾。我在Xbox360上遇到了完全相同的问题,没有世代GC。
我是否需要手动将每个对象分配为空?
这只是删除引用。与从列表中删除它相同。
最后,如果我包含我在技术上不需要的额外使用语句,那是否会影响我的记忆?例如,我的大多数类都包含一些他们实际上不需要的使用语句。是否有与性能相关的理由来清理它,还是仅仅是良好的编程习惯?
这里应该没有问题。
GC在程序结束前没有启动,这是正确的吗?
错误。 GC可以在任何时间点运行。通常,如果应用程序决定内存不足而操作系统无法提供任何内存,则它将运行GC。
仅仅因为我从列表中删除了对象,这不应该让GC有理由从内存中删除我的对象吗?
如果此列表仅包含引用,则GC可以自由删除该对象。但如果GC实际上是在那一刻运行的话,则无关紧要。
此外,通常,在编写游戏时,您应该限制您创建的对象数量。仅仅因为运行GC会产生大量不可预测的延迟。使用结构或重用现有实例。在粒子系统的情况下,最好的方法是为每个粒子和场提供结构,说明粒子是否有效。删除粒子时,只需将此字段设置为false即可。添加新粒子时,首先会找到不活动的粒子并设置相应的字段并激活它。