DOTA版设计模式——享元
Dota中地图有那么多的树,为什么没有拖慢游戏速度那,在此就要讲讲享元模式了。
享元模式将类的粒度进一步细化,FlyWeight的意思是最轻量级选手,也称蝇量模式,对于大量数量的对象来说,类将内蕴状态和外蕴状态分开,内蕴只含最少的数据,剩下的交给外蕴。保证多对象内存消耗不会过大。
UML图:
测试代码:
DotaPatternLibrary.Flyweight.Trees trees = new DotaPatternLibrary.Flyweight.Trees();
trees.Display();
GetMemery();
DotaPatternLibrary.Flyweight.NoFlyweightTrees noFlyweightTrees = new DotaPatternLibrary.Flyweight.NoFlyweightTrees();
noFlyweightTrees.Display();
GetMemery();
public void GetMemery()
{
PerformanceCounter myMemory = new PerformanceCounter();
myMemory.CategoryName = "Memory";
myMemory.CounterName = "Available KBytes";
string txtResult = "-->当前可用内存:" + myMemory.NextValue().ToString() + "KB";
Graphics graphics = LandpyForm.Form.GetGraphics();
graphics.DrawString(DateTime.Now.ToLongTimeString() + txtResult, new Font("宋体", 10f), new SolidBrush(Color.Red), 0, 0);
}
完整代码:
享元模式将类的粒度进一步细化,FlyWeight的意思是最轻量级选手,也称蝇量模式,对于大量数量的对象来说,类将内蕴状态和外蕴状态分开,内蕴只含最少的数据,剩下的交给外蕴。保证多对象内存消耗不会过大。
UML图:
测试代码:
DotaPatternLibrary.Flyweight.Trees trees = new DotaPatternLibrary.Flyweight.Trees();
trees.Display();
GetMemery();
DotaPatternLibrary.Flyweight.NoFlyweightTrees noFlyweightTrees = new DotaPatternLibrary.Flyweight.NoFlyweightTrees();
noFlyweightTrees.Display();
GetMemery();
public void GetMemery()
{
PerformanceCounter myMemory = new PerformanceCounter();
myMemory.CategoryName = "Memory";
myMemory.CounterName = "Available KBytes";
string txtResult = "-->当前可用内存:" + myMemory.NextValue().ToString() + "KB";
Graphics graphics = LandpyForm.Form.GetGraphics();
graphics.DrawString(DateTime.Now.ToLongTimeString() + txtResult, new Font("宋体", 10f), new SolidBrush(Color.Red), 0, 0);
}
完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Collections;
using DotaCommon;
namespace DotaPatternLibrary.Flyweight
{
internal class Tree
{
private int _x;
private int _y;
private int _size;
private Color _treeColor;
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
public int Size
{
get { return _size; }
set { _size = value; }
}
public Color TreeColor
{
get { return _treeColor; }
set { _treeColor = value; }
}
public Tree(int x, int y, int size, Color treeColor)
{
this._x = x;
this._y = y;
this._size = size;
this._treeColor = treeColor;
}
public void Display()
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(this._treeColor)), _x, _y, _size, _size);
}
}
public class NoFlyweightTrees
{
private Hashtable trees = new Hashtable();
public NoFlyweightTrees()
{
for (int i = 0; i < 20000; i++)
{
Random random = new Random();
int x = random.Next(0, LandpyForm.Form.PicWidth);
int y = random.Next(0, LandpyForm.Form.PicHeight);
int size = random.Next(3, 6);
trees.Add("CasuarinaTree" + i, new Tree(x, y, size, Color.Brown));
x = random.Next(0, LandpyForm.Form.PicWidth);
y = random.Next(0, LandpyForm.Form.PicHeight);
size = random.Next(3, 6);
trees.Add("YoungTree" + i, new Tree(x, y, size, Color.Green));
}
}
public void Display()
{
for (int i = 0; i < 20000; i++)
{
Tree tree = trees["CasuarinaTree" + i] as Tree;
tree.Display();
tree = trees["YoungTree" + i] as Tree;
tree.Display();
}
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawString("OK", new Font("宋体", 12f), new SolidBrush(Color.Black), 0, 0);
}
}
public class Trees
{
private Hashtable trees = new Hashtable();
public Trees()
{
for (int i = 0; i < 20000; i++)
{
trees.Add("CasuarinaTree" + i, new CasuarinaTree());
trees.Add("YoungTree" + i, new YoungTree());
}
}
public void Display()
{
for (int i = 0; i < 20000; i++)
{
Random random = new Random();
int x = random.Next(0, LandpyForm.Form.PicWidth);
int y = random.Next(0, LandpyForm.Form.PicHeight);
int size = random.Next(3, 6);
IFlyweightTree tree = trees["CasuarinaTree" + i] as IFlyweightTree;
tree.Display(x, y, size);
x = random.Next(0, LandpyForm.Form.PicWidth);
y = random.Next(0, LandpyForm.Form.PicHeight);
size = random.Next(3, 6);
tree = trees["YoungTree" + i] as IFlyweightTree;
tree.Display(x, y, size);
}
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawString("OK", new Font("宋体", 12f), new SolidBrush(Color.Black), 0, 0);
}
}
internal interface IFlyweightTree
{
void Display(int _x, int _y, int _size);
}
internal class CasuarinaTree : IFlyweightTree
{
public void Display(int _x, int _y, int _size)
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(Color.Brown)), _x, _y, _size, _size);
}
}
internal class YoungTree : IFlyweightTree
{
#region IFlyweightTree 成员
public void Display(int _x, int _y, int _size)
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(Color.Green)), _x, _y, _size, _size);
}
#endregion
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Collections;
using DotaCommon;
namespace DotaPatternLibrary.Flyweight
{
internal class Tree
{
private int _x;
private int _y;
private int _size;
private Color _treeColor;
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
public int Size
{
get { return _size; }
set { _size = value; }
}
public Color TreeColor
{
get { return _treeColor; }
set { _treeColor = value; }
}
public Tree(int x, int y, int size, Color treeColor)
{
this._x = x;
this._y = y;
this._size = size;
this._treeColor = treeColor;
}
public void Display()
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(this._treeColor)), _x, _y, _size, _size);
}
}
public class NoFlyweightTrees
{
private Hashtable trees = new Hashtable();
public NoFlyweightTrees()
{
for (int i = 0; i < 20000; i++)
{
Random random = new Random();
int x = random.Next(0, LandpyForm.Form.PicWidth);
int y = random.Next(0, LandpyForm.Form.PicHeight);
int size = random.Next(3, 6);
trees.Add("CasuarinaTree" + i, new Tree(x, y, size, Color.Brown));
x = random.Next(0, LandpyForm.Form.PicWidth);
y = random.Next(0, LandpyForm.Form.PicHeight);
size = random.Next(3, 6);
trees.Add("YoungTree" + i, new Tree(x, y, size, Color.Green));
}
}
public void Display()
{
for (int i = 0; i < 20000; i++)
{
Tree tree = trees["CasuarinaTree" + i] as Tree;
tree.Display();
tree = trees["YoungTree" + i] as Tree;
tree.Display();
}
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawString("OK", new Font("宋体", 12f), new SolidBrush(Color.Black), 0, 0);
}
}
public class Trees
{
private Hashtable trees = new Hashtable();
public Trees()
{
for (int i = 0; i < 20000; i++)
{
trees.Add("CasuarinaTree" + i, new CasuarinaTree());
trees.Add("YoungTree" + i, new YoungTree());
}
}
public void Display()
{
for (int i = 0; i < 20000; i++)
{
Random random = new Random();
int x = random.Next(0, LandpyForm.Form.PicWidth);
int y = random.Next(0, LandpyForm.Form.PicHeight);
int size = random.Next(3, 6);
IFlyweightTree tree = trees["CasuarinaTree" + i] as IFlyweightTree;
tree.Display(x, y, size);
x = random.Next(0, LandpyForm.Form.PicWidth);
y = random.Next(0, LandpyForm.Form.PicHeight);
size = random.Next(3, 6);
tree = trees["YoungTree" + i] as IFlyweightTree;
tree.Display(x, y, size);
}
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawString("OK", new Font("宋体", 12f), new SolidBrush(Color.Black), 0, 0);
}
}
internal interface IFlyweightTree
{
void Display(int _x, int _y, int _size);
}
internal class CasuarinaTree : IFlyweightTree
{
public void Display(int _x, int _y, int _size)
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(Color.Brown)), _x, _y, _size, _size);
}
}
internal class YoungTree : IFlyweightTree
{
#region IFlyweightTree 成员
public void Display(int _x, int _y, int _size)
{
Graphics graphic = LandpyForm.Form.GetGraphics();
graphic.DrawEllipse(new Pen(new SolidBrush(Color.Green)), _x, _y, _size, _size);
}
#endregion
}
}