享元模式:
该模式是比较简单的模式 其作用是把某一单元(比如怪物的熟悉啊,装备的属性)等拥有共同的信息的东西共享给需要使用的人 也就是 多人共享一个属性(这里的属性必须是不可变的属性 比如:名字,最大生命等)
这样,在敌人比较多的时候(或者其他属性相同的对象)就可以节省出来很多内存。所以在游戏内存优化的时候还是有必要使用的。
下面我们看下该模式的设计图:
这样 所有敌人都 持有敌人公共不变属性——这样所有的敌人公共属性都纯在同一个内存地址,如果有有上百敌人 那么皆可以节省上百个敌人的公共属性的内存,因为他们都是公用的同一个内存。
代码:敌人的公共类
public class Enemy
{
public EnenyAttr attr;
public int currentHP;
public int currentMP;
//...
public Enemy(string name) { attr = EnemyAttrManage.Instance.GetEnenyAttr(name); }
void atk()
{
}
}
代码:具体敌人1
public class EnemyOne : Enemy
{
public EnemyOne(string name) : base(name)
{
}
}
代码:具体敌人2
public class EnemyTwo : Enemy
{
public EnemyTwo(string name) : base(name)
{
}
}
代码:共属性管理者 (使用了单利模式:http://blog.csdn.net/scl_unity3d/article/details/78819251 单利模式讲解)
public class EnemyAttrManage
{/* 此处是单利模式 下次会讲解*/
private static EnemyAttrManage instance;
public static EnemyAttrManage Instance { get {
if (instance == null)
instance = new EnemyAttrManage();
return instance; } }
private EnemyAttrManage() { }
/* */
public EnenyAttr GetEnenyAttr(string name)
{
if (!dicAttr.ContainsKey(name))
{
Debug.LogError("要查找的公共属性不存在,请先添加:" + name);
return null;
}
return dicAttr[name];
}
public void AddEnenyAttr(string name,EnenyAttr attr)
{
if (dicAttr.ContainsKey(name))
{
Debug.LogError("公共属性已存在,请不要重复添加:" + name);
}
dicAttr.Add(name, attr);
}
private Dictionary<string, EnenyAttr> dicAttr = new Dictionary<string, EnenyAttr>();
}
这样 每个敌人构造的时候都会从属性管理者中的字典中取出对应的公共属性,这样每个敌人的属性都是引用的字典中的同一份,这样,如果有大量敌人的时候就会为游戏节省出很多内存。所以还是有必要了解的。