设计模式 ---- 享元模式
享元模式(错误,待修改)
关于享元模式,最重要的一点:共享。
享元模式主要用于解决大量对象存在时,重复数据造成的内存占用问题。
在游戏开发中,经常会出现这样的情况:
例如一个场景中生成了大量相同类型的树、NPC、小怪。
一棵树可能包含:
class Tree
{
public:
Mesh* mesh;
Texture* texture;
Material* material;
FVector position;
float rotation;
float scale;
};
其中:
Mesh
Texture
Material
对于同一种树来说,通常都是相同的。
真正不同的可能只有:
Position
Rotation
Scale
例如:
Tree tree1;
tree1.mesh = TreeMesh;
tree1.texture = TreeTexture;
tree1.material = TreeMaterial;
tree1.position = FVector(100, 200, 0);
Tree tree2;
tree2.mesh = TreeMesh;
tree2.texture = TreeTexture;
tree2.material = TreeMaterial;
tree2.position = FVector(500, 300, 0);
虽然 tree1 和 tree2 是两个不同的对象,但它们使用的是完全相同的:
Mesh
Texture
Material
如果这些数据被作为对象自身的一部分保存,那么随着对象数量增加,就可能产生大量重复数据。
所以,我们可以把可以共享的状态提取出来:
class TreeType
{
public:
Mesh* mesh;
Texture* texture;
Material* material;
};
TreeType 就可以理解为一种“树的类型”。
然后具体的树对象只保存自己独有的状态:
class Tree
{
public:
TreeType* type;
FVector position;
float rotation;
float scale;
};
于是:
TreeType normalTree;
Tree tree1;
tree1.type = &normalTree;
tree1.position = FVector(100, 200, 0);
Tree tree2;
tree2.type = &normalTree;
tree2.position = FVector(500, 300, 0);
Tree tree3;
tree3.type = &normalTree;
tree3.position = FVector(800, 100, 0);
此时:
Tree1 ─────┐
Tree2 ─────┼──→ normalTree
Tree3 ─────┘
三棵树共享同一个 TreeType。
其中:
TreeType
↓
Mesh
Texture
Material
属于可以共享的内部状态。
而:
Tree
↓
Position
Rotation
Scale
属于每个对象自己独有的外部状态。
因此,享元模式的核心可以总结为:
将大量对象中重复的状态提取出来,形成可以共享的享元对象,让多个对象共同使用它,从而减少重复数据带来的内存开销。
需要注意的是,使用指针本身并不等于使用了享元模式。
指针只是实现共享的一种手段。
真正体现享元模式的是:
发现对象之间存在大量重复状态 → 把重复状态抽取成独立对象 → 多个对象共享这个对象。
浙公网安备 33010602011771号