【问题标题】:How to mark instance for deletion in XNA/Monogame如何在 XNA/Monogame 中标记要删除的实例
【发布时间】:2013-12-12 02:19:14
【问题描述】:

在我的塔防游戏中,当我的敌人死去时,我希望他们死,对吗?所以,我需要删除它们。我是从 C++ 过来的,您可以使用 delete MyInstance; 删除类的实例,但这在 C# 中不起作用。我知道 C# 中有一个垃圾收集器可以为您删除内容,但是,您如何标记要删除的实例?谢谢!!!

【问题讨论】:

  • @Mariano 的回答很好,除了记得在设置为 null 后停止更新和绘制敌人以确保不会发生错误。
  • 谢谢大家的回答!他们都很好!不过,我不得不选择 marianos,因为我是初学者,我只需要一个简单的答案。不过还是谢谢你们!

标签: xna c# 2d monogame


【解决方案1】:

我的建议是不要删除它们。虽然您有一个垃圾收集器可以提供帮助,但从性能的角度来看,不使用它通常是您的最佳选择。

想想你可能拥有的最大敌人数量。

创建一个 Enemy 对象的循环缓冲区:本质上是一个 Enemy 对象数组和一个 last 指针。

为每个敌人添加一个“IsActive”标志。

当你想创建一个新敌人时,从最后一个指针向前穿过循环缓冲区,直到找到一个 IsActive 标志设置为 false 的 Enemy。设置指向该敌人的最后一个指针,使该敌人成为您关心的类型,并将其 IsActive 标志设置为 true。

当敌人死亡时,将其 IsActive 标志设置为 false。

在您的 Update 和 Draw 循环中,您只需遍历缓冲区,然后对 IsActive 设置为 true 的每个 Enemy 进行操作或绘制。

【讨论】:

    【解决方案2】:

    您可以将对象显式设置为 null,这会将其标记为垃圾回收。

    Enemy e = new Enemy();
    
    // do stuff with enemy
    
    // Set to null
    e = null;
    

    【讨论】:

    • 虽然这个答案基本上是正确的,但它也毫无意义,因为一旦实例超出范围,它就会被标记为删除。为了代码的可读性,我建议不要养成这样做的习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多