@@ -11,71 +11,101 @@ struct uiVertex
11
11
public Vector2 uv ;
12
12
}
13
13
14
- static ComputeBuffer computeBuffer ;
15
- static List < uiVertex > vertexes ;
14
+ static ComputeBuffer _computeBuffer ;
15
+ static List < uiVertex > _vertices ;
16
16
17
- static ComputeBuffer indexBuffer ;
18
- static List < int > indexes ;
17
+ static ComputeBuffer _indexBuffer ;
18
+ static List < int > _indices ;
19
19
20
- static int startVertex ;
21
- static int startIndex ;
20
+ static int _startVertex ;
21
+ static int _startIndex ;
22
+
23
+ static int _instanceNum ;
24
+
25
+ public static bool enableComputeBuffer = true ;
26
+
27
+ public const int COMPUTE_BUFFER_MAX_ITEM_NUM = 1024 * 1024 ; // maxsize = 1M vertex/index
22
28
23
29
static bool supportComputeBuffer {
24
- get { return CanvasShader . supportComputeBuffer ; }
30
+ get { return SystemInfo . supportsComputeShaders && CanvasShader . supportComputeBuffer && enableComputeBuffer ; }
31
+ }
32
+
33
+ static void tryReleaseComputeBuffer ( ) {
34
+ _instanceNum -- ;
35
+
36
+ if ( ! supportComputeBuffer ) {
37
+ return ;
38
+ }
39
+
40
+ if ( _computeBuffer == null ) {
41
+ return ;
42
+ }
43
+
44
+ if ( _instanceNum != 0 ) {
45
+ return ;
46
+ }
47
+
48
+ _computeBuffer . Dispose ( ) ;
49
+ _indexBuffer . Dispose ( ) ;
50
+ _vertices = null ;
51
+ _indices = null ;
52
+ _computeBuffer = null ;
53
+ _indexBuffer = null ;
25
54
}
26
55
27
56
void initComputeBuffer ( ) {
28
57
var stride = Marshal . SizeOf ( typeof ( uiVertex ) ) ;
29
- computeBuffer = new ComputeBuffer ( 1024 * 1024 , stride ) ;
30
- vertexes = new List < uiVertex > ( ) ;
58
+ var strideIndex = Marshal . SizeOf ( typeof ( int ) ) ;
59
+ _computeBuffer = new ComputeBuffer ( COMPUTE_BUFFER_MAX_ITEM_NUM , stride ) ;
60
+ _vertices = new List < uiVertex > ( ) ;
31
61
32
- indexBuffer = new ComputeBuffer ( 1024 * 1024 , Marshal . SizeOf ( typeof ( int ) ) ) ;
33
- indexes = new List < int > ( ) ;
62
+ _indexBuffer = new ComputeBuffer ( COMPUTE_BUFFER_MAX_ITEM_NUM , strideIndex ) ;
63
+ _indices = new List < int > ( ) ;
34
64
}
35
65
36
66
void resetComputeBuffer ( ) {
37
67
if ( ! supportComputeBuffer ) return ;
38
68
39
- if ( computeBuffer == null ) {
69
+ if ( _computeBuffer == null ) {
40
70
this . initComputeBuffer ( ) ;
41
71
}
42
72
43
- vertexes . Clear ( ) ;
44
- indexes . Clear ( ) ;
45
- startVertex = 0 ;
46
- startIndex = 0 ;
73
+ _vertices . Clear ( ) ;
74
+ _indices . Clear ( ) ;
75
+ _startVertex = 0 ;
76
+ _startIndex = 0 ;
47
77
}
48
78
49
79
void bindComputeBuffer ( ) {
50
80
if ( ! supportComputeBuffer ) return ;
51
81
52
- computeBuffer . SetData ( vertexes ) ;
53
- indexBuffer . SetData ( indexes ) ;
82
+ _computeBuffer . SetData ( _vertices ) ;
83
+ _indexBuffer . SetData ( _indices ) ;
54
84
}
55
85
56
86
void addMeshToComputeBuffer ( List < Vector3 > vertex , List < Vector2 > uv , List < int > triangles ) {
57
87
if ( ! supportComputeBuffer ) return ;
58
88
59
- startVertex = vertexes . Count ;
60
- startIndex = indexes . Count ;
89
+ _startVertex = _vertices . Count ;
90
+ _startIndex = _indices . Count ;
61
91
62
92
var hasUv = uv != null ;
63
93
64
94
for ( int i = 0 ; i < vertex . Count ; i ++ ) {
65
- vertexes . Add ( new uiVertex {
95
+ _vertices . Add ( new uiVertex {
66
96
position = new Vector2 ( vertex [ i ] . x , vertex [ i ] . y ) ,
67
97
uv = hasUv ? uv [ i ] : Vector2 . zero
68
98
} ) ;
69
99
}
70
100
71
101
foreach ( var triangleId in triangles ) {
72
- indexes . Add ( triangleId + startVertex ) ;
102
+ _indices . Add ( triangleId + _startVertex ) ;
73
103
}
74
104
}
75
105
76
106
/*public void DrawBuffer(CommandBuffer cmdBuf)
77
107
{
78
- if (this.computeBuffer == null)
108
+ if (this._computeBuffer == null)
79
109
{
80
110
this.initComputeBuffer();
81
111
}
@@ -116,9 +146,9 @@ void addMeshToComputeBuffer(List<Vector3> vertex, List<Vector2> uv, List<int> tr
116
146
this.addMeshToComputeBuffer(vert, null, index);
117
147
118
148
var mpb = new MaterialPropertyBlock();
119
- mpb.SetBuffer("databuffer", this.computeBuffer );
120
- mpb.SetBuffer("indexbuffer", this.indexBuffer );
121
- mpb.SetInt("_startVertex", this.startIndex );
149
+ mpb.SetBuffer("databuffer", this._computeBuffer );
150
+ mpb.SetBuffer("indexbuffer", this._indexBuffer );
151
+ mpb.SetInt("_startVertex", this._startIndex );
122
152
cmdBuf.DrawProcedural(Matrix4x4.identity, this.material, 0, MeshTopology.Triangles, 6, 1, mpb);
123
153
}
124
154
}
0 commit comments