数据结构学习笔记(一) 双列表管理应用

来源:互联网 发布:老人去世六年无人知 编辑:程序博客网 时间:2024/05/26 12:54

在游戏中免不了需要对怪物进行动态的生成,死亡的时候要对其销毁,这样就是一个怪物的生命历程循环过程。如果按照一般的游戏设计方式,到了一定时间就进行怪物的刷新,如果每次都需要动态的new一个怪物出来,死亡后又要动态的销毁,这样就会大幅度降低游戏的性能。尤其是在怪物一同刷新和一同的销毁的时候,玩家有可能会出现卡机情况,那么如何避免这种事情的发生呢?

为了确保性能这里我们只可以牺牲内存来确保性能,如何利用内存来确保即使同时刷新怪物的时候都不会卡呢?这里我就介绍一种非常简单好用的方法,双列表的方式进行管理。利用List进行内存的管理,这样就可以避免重复的new一个新资源。

1、避免了频繁使用的时候产生的大量内存碎片,从而降低游戏运行效率。

2、避免了内存的泄露(C#一般不会有这种问题,但是C++很容易出现这个问题)

3、便于资源的统一回收和管理。(在场景切换的时候,我们可以统一释放怪物的资源)

这里我就用一个简单案例进行讲解:

首先我们要有一个简单的怪物属性类或者结构体,如图所示:


其次需要一个列表来存放场景内还活着的怪物,如下图所示:


其次另一个列表来存放死亡后消失的怪物,如下图所示:


再来就是一些简单的添加或移除列表元素函数即可,这样简单的双列表就基本完成了,代码就直接放出来:

using UnityEngine;using System.Collections.Generic;public class DoubleLinked{    public class CubeData    {        public GameObject cube;        public int HP;        public string name;    }    /// <summary>    /// 活着的矩形    /// </summary>    public List<CubeData> livecubes = new List<CubeData>();    /// <summary>    /// 死亡的矩形    /// </summary>    public List<CubeData> diecubes = new List<CubeData>();    public void AddLiveCubes(CubeData vlueData)    {        if(livecubes != null)            livecubes.Add(vlueData);    }    public void AddDieCubes(CubeData vlueData)    {        if (diecubes != null)            diecubes.Add(vlueData);    }    public void RemoveLiveCubes(CubeData vlueData)    {        if (livecubes.Count > 0)        {            livecubes.Remove(vlueData);        }    }    public void RemoveDieCubes(CubeData vlueData)    {        if (diecubes.Count > 0)        {            diecubes.Remove(vlueData);        }    }}
然后就是简单的应用了,首先要先去生成怪物,这里我就动态生产了5个Cube,然后将它们位置都错开避免影响我们的观察,代码如图所示:


这里你可以去断点或者自己Debug一下看看是不是所有的怪物都放入Live列表里面去了,如果没有出现错误的话,打印出来的效果如下图所示:


这样就表示4个Cube都存入到Live列表里面了。

下一步就写一个简单方法让Cube消失:

1、方法就是点击一下Cube

2、Cube就扣HP

3、当HP等于0的时候就死亡消失并且从Live列表移除,存入到Die列表里面去;

功能十分简单,代码就如图所示:


这样我可以测试测试一下效果如何了,效果如下图所示:


打印出来的正是存放到Die列表的两个怪物的名字,这表示怪物已经从live表里面移除了存放进die表里面了,如此一来怪物的一次简单生命历程也结束了。

那么如果需要新的怪物时候怎么办?可以先去查看Die表里面是否有我们需要的怪物,如果存在那么就将其转移到需要放置的位置、添加其属性后显示出来即可,如果没有的话我们就需要new一个出来然后存放到Live表里面进行统一的管理和销毁。

这种管理的方式并不一定要使用列表,存储的方式大可以根据项目进行改变,其中的管理方式都基本一致。

后面重新生成怪物的方法很简单,这里就不放出代码了(PS:我也没有去写,如果还是不懂得话就私信我)

0 0