@@ -26,14 +26,15 @@ export default {
26
26
const hashesMTime = { } ;
27
27
const currentMTime = ref ( 1 ) ;
28
28
let objectManager = null ;
29
+ let updateInProgress = 0 ;
29
30
30
31
function resize ( ) {
31
32
const { width, height } = container . value . getBoundingClientRect ( ) ;
32
33
const w = Math . floor ( width * window . devicePixelRatio + 0.5 ) ;
33
34
const h = Math . floor ( height * window . devicePixelRatio + 0.5 ) ;
34
35
canvasWidth . value = w ;
35
36
canvasHeight . value = h ;
36
- console . log ( `vtkLocal::resize ${ width } x${ height } ` ) ;
37
+ // console.log(`vtkLocal::resize ${width}x${height}`);
37
38
if ( props . renderWindow . length > 0 ) {
38
39
nextTick ( ( ) => {
39
40
objectManager . setSize ( props . renderWindow , w , h ) ;
@@ -48,102 +49,123 @@ export default {
48
49
const serverState = await session . call ( "vtklocal.get.state" , [ vtkId ] ) ;
49
50
if ( serverState . length > 0 ) {
50
51
stateMTimes [ vtkId ] = JSON . parse ( serverState ) . MTime ;
51
- console . log ( `vtkLocal::state(${ vtkId } )` ) ;
52
+ // console.log(`vtkLocal::state(${vtkId})`);
52
53
objectManager . registerState ( serverState ) ;
53
54
} else {
54
- throw new Error ( `Server returned empty state for ${ vtkId } ` ) ;
55
+ console . log ( `Server returned empty state for ${ vtkId } ` ) ;
56
+ // throw new Error(`Server returned empty state for ${vtkId}`);
55
57
}
56
58
return serverState ;
57
59
}
58
60
async function fetchHash ( hash ) {
59
61
const session = client . getConnection ( ) . getSession ( ) ;
62
+ // console.log(`vtkLocal::hash(${hash}) - before`);
60
63
const blob = await session . call ( "vtklocal.get.hash" , [ hash ] ) ;
61
- console . log ( `vtkLocal::hash(${ hash } )` ) ;
62
64
const array = new Uint8Array ( await blob . arrayBuffer ( ) ) ;
63
65
objectManager . registerBlob ( hash , array ) ;
66
+ // console.log(`vtkLocal::hash(${hash}) - available`);
64
67
hashesMTime [ hash ] = unref ( currentMTime ) ;
65
68
return blob ;
66
69
}
67
70
68
71
async function update ( startEventLoop = false ) {
69
- console . log ( "vtkLocal::update(begin)" ) ;
70
- const session = client . getConnection ( ) . getSession ( ) ;
71
- const serverStatus = await session . call ( "vtklocal.get.status" , [
72
- props . renderWindow ,
73
- ] ) ;
74
- const pendingRequests = [ ] ;
75
- console . log ( "ids" , serverStatus . ids ) ;
76
- serverStatus . ids . forEach ( ( [ vtkId , mtime ] ) => {
77
- if ( ! stateMTimes [ vtkId ] || stateMTimes [ vtkId ] < mtime ) {
78
- console . log ( "fetch" , vtkId ) ;
79
- pendingRequests . push ( fetchState ( vtkId ) ) ;
80
- } else {
81
- console . log ( "skip" , vtkId ) ;
82
- }
83
- } ) ;
84
- serverStatus . ignore_ids . forEach ( ( vtkId ) => {
85
- objectManager . unRegisterState ( vtkId ) ;
86
- } ) ;
87
- serverStatus . hashes . forEach ( ( hash ) => {
88
- if ( ! hashesMTime [ hash ] ) {
89
- pendingRequests . push ( fetchHash ( hash ) ) ;
90
- }
91
- hashesMTime [ hash ] = unref ( currentMTime ) ;
92
- } ) ;
93
- await Promise . all ( pendingRequests ) ;
94
- // Shows memory, feel free to remove.
95
- console . log (
96
- `vtkLocal::update(end) blobs: ${
97
- objectManager . getTotalBlobMemoryUsage ( ) / 1024
98
- } kB, objects: ${
99
- objectManager . getTotalVTKDataObjectMemoryUsage ( ) / 1024
100
- } kB`
101
- ) ;
102
- objectManager . update ( startEventLoop ) ;
103
- resize ( ) ;
104
- emit ( "updated" ) ;
72
+ updateInProgress ++ ;
73
+ if ( updateInProgress !== 1 ) {
74
+ // console.error("Skip concurrent update");
75
+ return ;
76
+ }
105
77
106
- // Memory management
107
- currentMTime . value ++ ;
108
- const threshold =
109
- props . cacheSize + objectManager . getTotalVTKDataObjectMemoryUsage ( ) ;
110
- if ( objectManager . getTotalBlobMemoryUsage ( ) > threshold ) {
111
- // Need to remove old blobs
112
- const threshold =
113
- props . cacheSize + objectManager . getTotalVTKDataObjectMemoryUsage ( ) ;
114
- const tsMap = { } ;
115
- let mtimeToFree = unref ( currentMTime ) ;
116
- Object . entries ( hashesMTime ) . forEach ( ( [ hash , mtime ] ) => {
117
- if ( mtime < mtimeToFree ) {
118
- mtimeToFree = mtime ;
119
- }
120
- const sMtime = mtime . toString ( ) ;
121
- if ( tsMap [ sMtime ] ) {
122
- tsMap [ sMtime ] . push ( hash ) ;
78
+ try {
79
+ // console.log("vtkLocal::update(begin)");
80
+ const session = client . getConnection ( ) . getSession ( ) ;
81
+ const serverStatus = await session . call ( "vtklocal.get.status" , [
82
+ props . renderWindow ,
83
+ ] ) ;
84
+ const pendingRequests = [ ] ;
85
+ // console.log("ids", serverStatus.ids);
86
+ serverStatus . ids . forEach ( ( [ vtkId , mtime ] ) => {
87
+ if ( ! stateMTimes [ vtkId ] || stateMTimes [ vtkId ] < mtime ) {
88
+ // console.log("fetch", vtkId);
89
+ pendingRequests . push ( fetchState ( vtkId ) ) ;
123
90
} else {
124
- tsMap [ sMtime ] = [ hash ] ;
91
+ // console.log("skip", vtkId);
92
+ }
93
+ } ) ;
94
+ serverStatus . ignore_ids . forEach ( ( vtkId ) => {
95
+ objectManager . unRegisterState ( vtkId ) ;
96
+ } ) ;
97
+ serverStatus . hashes . forEach ( ( hash ) => {
98
+ if ( ! hashesMTime [ hash ] ) {
99
+ pendingRequests . push ( fetchHash ( hash ) ) ;
125
100
}
101
+ hashesMTime [ hash ] = unref ( currentMTime ) ;
126
102
} ) ;
103
+ await Promise . all ( pendingRequests ) ;
104
+ try {
105
+ objectManager . update ( startEventLoop ) ;
106
+ } catch ( e ) {
107
+ console . error ( "WASM update failed" ) ;
108
+ console . log ( e ) ;
109
+ }
110
+ resize ( ) ;
111
+ emit ( "updated" ) ;
127
112
128
- // Remove blobs starting by the old ones
129
- while ( objectManager . getTotalBlobMemoryUsage ( ) > threshold ) {
130
- const hashesToDelete = tsMap [ mtimeToFree ] ;
131
- for ( let i = 0 ; i < hashesToDelete . length ; i ++ ) {
132
- objectManager . unRegisterBlob ( hashesToDelete [ i ] ) ;
113
+ // Memory management
114
+ currentMTime . value ++ ;
115
+ const threshold =
116
+ Number ( props . cacheSize ) +
117
+ objectManager . getTotalVTKDataObjectMemoryUsage ( ) ;
118
+ if ( objectManager . getTotalBlobMemoryUsage ( ) > threshold ) {
119
+ // console.log("Free memory");
120
+ // Need to remove old blobs
121
+ const tsMap = { } ;
122
+ let mtimeToFree = unref ( currentMTime ) ;
123
+ Object . entries ( hashesMTime ) . forEach ( ( [ hash , mtime ] ) => {
124
+ if ( mtime < mtimeToFree ) {
125
+ mtimeToFree = mtime ;
126
+ }
127
+ const sMtime = mtime . toString ( ) ;
128
+ if ( tsMap [ sMtime ] ) {
129
+ tsMap [ sMtime ] . push ( hash ) ;
130
+ } else {
131
+ tsMap [ sMtime ] = [ hash ] ;
132
+ }
133
+ } ) ;
134
+
135
+ // Remove blobs starting by the old ones
136
+ while ( objectManager . getTotalBlobMemoryUsage ( ) > threshold ) {
137
+ const hashesToDelete = tsMap [ mtimeToFree ] ;
138
+ if ( hashesToDelete ) {
139
+ for ( let i = 0 ; i < hashesToDelete . length ; i ++ ) {
140
+ // console.log(
141
+ // `Delete hash(${hashesToDelete[i]}) - mtime: ${mtimeToFree}`
142
+ // );
143
+ objectManager . unRegisterBlob ( hashesToDelete [ i ] ) ;
144
+ delete hashesMTime [ hashesToDelete [ i ] ] ;
145
+ }
146
+ }
147
+ mtimeToFree ++ ;
133
148
}
134
- mtimeToFree ++ ;
149
+ }
150
+ emit ( "memory" , {
151
+ blobs : objectManager . getTotalBlobMemoryUsage ( ) ,
152
+ scene : objectManager . getTotalVTKDataObjectMemoryUsage ( ) ,
153
+ } ) ;
154
+ } catch ( e ) {
155
+ console . error ( "Error in update" , e ) ;
156
+ } finally {
157
+ updateInProgress -- ;
158
+ if ( updateInProgress ) {
159
+ updateInProgress = 0 ;
160
+ update ( ) ;
135
161
}
136
162
}
137
- emit ( "memory" , {
138
- blobs : objectManager . getTotalBlobMemoryUsage ( ) ,
139
- scene : objectManager . getTotalVTKDataObjectMemoryUsage ( ) ,
140
- } ) ;
141
163
}
142
164
143
165
onMounted ( async ( ) => {
144
- console . log ( "vtkLocal::mounted" ) ;
166
+ // console.log("vtkLocal::mounted");
145
167
objectManager = await createModule ( unref ( canvas ) ) ;
146
- console . log ( "objectManager" , objectManager ) ;
168
+ // console.log("objectManager", objectManager);
147
169
resizeObserver . observe ( unref ( container ) ) ;
148
170
update ( /*startEventLoop=*/ true ) ;
149
171
setTimeout ( ( ) => {
@@ -154,7 +176,7 @@ export default {
154
176
} ) ;
155
177
156
178
onBeforeUnmount ( ( ) => {
157
- console . log ( "vtkLocal::unmounted" ) ;
179
+ // console.log("vtkLocal::unmounted");
158
180
if ( resizeObserver ) {
159
181
resizeObserver . disconnect ( ) ;
160
182
resizeObserver = null ;
0 commit comments