Skip to content

Commit 5e12eb9

Browse files
committed
增加脏标记模式 | add Dirty Flag Pattern
增加脏标记模式 | add Dirty Flag Pattern
1 parent 0786970 commit 5e12eb9

File tree

6 files changed

+206
-0
lines changed

6 files changed

+206
-0
lines changed

Assets/Game Programming Patterns/Dirty Flag Pattern.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Game Programming Patterns/Dirty Flag Pattern/Example.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
//-------------------------------------------------------------------------------------
2+
// DirtyFlagPatternExample.cs
3+
//-------------------------------------------------------------------------------------
4+
5+
using UnityEngine;
6+
using System.Collections;
7+
using System;
8+
9+
namespace DirtyFlagPatternExample
10+
{
11+
public class DirtyFlagPatternExample : MonoBehaviour
12+
{
13+
GraphNode graphNode = new GraphNode(new MeshEX());
14+
TransformEX parentWorldTransform = new TransformEX();
15+
void Start()
16+
{
17+
//初始化子节点
18+
for (int i = 0; i < graphNode.NumChildren; i++)
19+
{
20+
graphNode.Children[i] = new GraphNode(new MeshEX());
21+
}
22+
//进行渲染
23+
graphNode.render(TransformEX.origin, true);
24+
}
25+
26+
void Update()
27+
{
28+
if (Input.GetKeyDown(KeyCode.Alpha1))
29+
{
30+
//修改位置,触发脏标记
31+
TransformEX newLocalTransform = new TransformEX();
32+
newLocalTransform.Position = new Vector3(2, 2, 2);
33+
graphNode.setTransform(newLocalTransform);
34+
35+
//再次进行渲染
36+
graphNode.render(parentWorldTransform, true);
37+
}
38+
}
39+
}
40+
41+
/// <summary>
42+
/// 网格类
43+
/// </summary>
44+
class MeshEX
45+
{
46+
47+
}
48+
49+
/// <summary>
50+
/// 位置类
51+
/// </summary>
52+
class TransformEX
53+
{
54+
private Vector3 position = new Vector3(1, 1, 1);
55+
public Vector3 Position
56+
{
57+
get { return position; }
58+
set { position = value; }
59+
}
60+
61+
public static TransformEX origin = new TransformEX();
62+
63+
public TransformEX combine(TransformEX other)
64+
{
65+
66+
TransformEX trans = new TransformEX();
67+
if (other != null)
68+
{
69+
trans.Position = Position + other.Position;
70+
}
71+
return trans;
72+
}
73+
74+
};
75+
76+
/// <summary>
77+
/// 场景图节点
78+
/// </summary>
79+
class GraphNode
80+
{
81+
//脏标记 dirty flag
82+
private bool dirty_;
83+
84+
private MeshEX mesh_;
85+
private TransformEX local_;
86+
private TransformEX world_ = new TransformEX();
87+
const int MAX_CHILDREN = 100;
88+
89+
/// <summary>
90+
/// 子节点
91+
/// </summary>
92+
private GraphNode[] children_ = new GraphNode[MAX_CHILDREN];
93+
public GraphNode[] Children
94+
{
95+
get { return children_; }
96+
set { children_ = value; }
97+
}
98+
99+
/// <summary>
100+
/// 子节点
101+
/// </summary>
102+
private int numChildren_ = 88;
103+
public int NumChildren
104+
{
105+
get { return numChildren_; }
106+
set { numChildren_ = value; }
107+
}
108+
109+
public GraphNode(MeshEX mesh)
110+
{
111+
mesh_ = mesh;
112+
local_ = TransformEX.origin;
113+
dirty_ = true;
114+
115+
}
116+
117+
/// <summary>
118+
/// 设置局部坐标位置
119+
/// </summary>
120+
public void setTransform(TransformEX local)
121+
{
122+
local_ = local;
123+
dirty_ = true;
124+
}
125+
126+
/// <summary>
127+
/// 渲染
128+
/// </summary>
129+
public void render(TransformEX parentWorld, bool dirty)
130+
{
131+
//如果父链中它之上的任何物体标记为脏,则它将被置为true
132+
dirty |= dirty_;
133+
134+
//而当节点没有改动时(dirty=false),跳过combine的过程,否则,表示此链为脏,进行combine
135+
if (dirty)
136+
{
137+
Debug.Log("this node is dirty,combine it!");
138+
world_ = local_.combine(parentWorld);
139+
dirty_ = false;
140+
}
141+
142+
//渲染mesh
143+
if (mesh_ != null)
144+
{
145+
renderMesh(mesh_, world_);
146+
}
147+
148+
for (int i = 0; i < numChildren_; i++)
149+
{
150+
if (children_[i] != null)
151+
{
152+
children_[i].render(world_, dirty);
153+
}
154+
155+
}
156+
}
157+
158+
/// <summary>
159+
/// 网格的渲染
160+
/// </summary>
161+
private void renderMesh(MeshEX mesh_, TransformEX world_)
162+
{
163+
Debug.Log("renderMesh!");
164+
}
165+
}
166+
167+
}
168+

Assets/Game Programming Patterns/Dirty Flag Pattern/Example/DirtyFlagPatternExample.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.

Assets/Game Programming Patterns/Dirty Flag Pattern/Example/DirtyFlagPatternExample.unity.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)