如何删除对象以便它们不再使用处理器电源

时间:2013-12-06 05:19:12

标签: c# .net list object

基本上,我有无数的块(每个块都是由“Enemy”类构建)被创建,存储到列表中,并在屏幕上发送动画。它永远这样做。我想在创建100个块之后删除第一个块,以免使用太多的处理能力。有什么想法吗?

这是我想要删除的整个类别的代码:

namespace MovementTestV1
 {
class Enemy
{

    protected Dispatcher dispatcher;
    protected Canvas Background;
    protected Label Display;
    Int32 waitTime;
    double EnemyWidth = 53;
    Image EnemyImage;
    String FilePathImage;
    BitmapImage bitPic;
    protected double x, y;
    System.Windows.Forms.Timer tmr;
    double incrementSize = 5.0;
    private int i = 0;

     public Enemy(Canvas Background, Dispatcher dispatcher, Dictionary<String, String> keys,Label Display, Int32 waitTime = 100)
    {
        this.Background = Background;
        this.dispatcher = dispatcher;
        this.waitTime = 70;
        //this.keys = keys;
        this.Display = Display;

        EnemyImage = new Image();
        EnemyImage.Width = EnemyWidth;

        FilePathImage = @"RedSqare.png";
        bitPic = LoadBitmap(FilePathImage, EnemyWidth);

        //tmr = new System.Windows.Forms.Timer();
        //tmr.Interval = this.waitTime;
        //tmr.Tick += new EventHandler(Position);
        //tmr.Start();

    }
    protected BitmapImage LoadBitmap(String assetsRelativePath, double decodeWidth)
    {
        BitmapImage theBitmap = new BitmapImage();
        theBitmap.BeginInit();
        String basePath = System.IO.Path.Combine(Environment.CurrentDirectory, @"assets\");
        String path = System.IO.Path.Combine(basePath, assetsRelativePath);
        theBitmap.UriSource = new Uri(path, UriKind.Absolute);
        theBitmap.DecodePixelWidth = (int)decodeWidth;
        theBitmap.EndInit();

        return theBitmap;
    }


    public void Place(double x, double y)
    {

        EnemyImage.Source = bitPic;
        this.x = x;
        this.y = y;

        Background.Children.Add(EnemyImage);
        EnemyImage.SetValue(Canvas.LeftProperty, x);
        EnemyImage.SetValue(Canvas.TopProperty, y);


        tmr = new System.Windows.Forms.Timer();
        tmr.Interval = 10;
        tmr.Tick += new EventHandler(Position);
        tmr.Start();

    }

    public void Position(object sender, System.EventArgs e)
    {


        i++;

        if (i < 9000)
        {
             x -= incrementSize *.3;

        }

        UpdatePosition();

    }
    void UpdatePosition()
    {

        EnemyImage.SetValue(Canvas.LeftProperty, x);
        EnemyImage.SetValue(Canvas.TopProperty, y);
    }


    public double X
    {
        get
        {
            return x;
        }
        set
        {
            x = value;
        }
    }

    public double Y
    {
        get
        {
            return y;
        }
        set
        {
            y = value;
        }
    }

    public void Shutdown()
    {
        tmr.Stop();

    }

}

}

  public void spawn(object sender, System.EventArgs e)
    {
        Int32 place = random.Next(1, 4);

        Enemy enemy;
        i += 2;
        if (i % 46 == 0)
        {
            Int32 Ycoord = random.Next(0, 700);
            switch (place)
            {
                case 1:
                    enemy = new Enemy(Background, dispatcher, keys, Display, 10);
                    enemy.Place(1080, Ycoord);

                    break;
                case 2:
                    enemy = new Enemy(Background, dispatcher, keys, Display, 10);
                    enemy.Place(1080, Ycoord);

                    break;
                default:
                    enemy = new Enemy(Background, dispatcher, keys, Display, 10);
                    enemy.Place(1080, Ycoord);
                    break;
            }
            enemies.Add(enemy);
        }
        if (enemies.Count > 5)
        {
          //THIS PART DOESNT WORK!!!!!
            enemies.RemoveAt(0);
            //enemies[1] = 0;
            ////enemies[2] = null;
            //enemies[2].Shutdown();
            ////enemies[3] = null;
            //enemies[3].Shutdown();
            ////enemies[4] = null;
            //enemies[4].Shutdown();
        }
    }

1 个答案:

答案 0 :(得分:0)

很难说没有任何代码可以解决...但是,您可以检查您的列表是否有超过100个块,然后将您的第一个块设置为null。 C#有一个垃圾收集器,可以清理乱七八糟的东西。

编辑:或使用上述删除方法。

for ( int i = 0; i < enemies.size(); ++i )
{
    if ( enemies.Count > 5 )
    {
        enemies.Remove(i);
    } 
}