Skip to content

Commit 888d630

Browse files
simonghalesSimon Hales
andauthored
Combine frame & sync ops to avoid erratic renders
* fixes bodies sync bug Co-authored-by: Simon Hales <simon.h@iconinteractive.com>
1 parent 7c0daaa commit 888d630

File tree

3 files changed

+25
-46
lines changed

3 files changed

+25
-46
lines changed

examples/yarn.lock

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,18 +1437,6 @@
14371437
schema-utils "^2.6.5"
14381438
source-map "^0.7.3"
14391439

1440-
"@pmmmwh/react-refresh-webpack-plugin@^0.3.2":
1441-
version "0.3.3"
1442-
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.3.3.tgz#40a3d674f42a011b7f30a9609aa8fb68ec3c39c9"
1443-
integrity sha512-uc6FmPEegAZawSHjUMFQwU7EjaDn7zy1iD/KD/wBROL9F4378OES8MKMYHoRAKT61Fk7LxVKZSDR5VespMQiqw==
1444-
dependencies:
1445-
ansi-html "^0.0.7"
1446-
error-stack-parser "^2.0.6"
1447-
html-entities "^1.2.1"
1448-
lodash.debounce "^4.0.8"
1449-
native-url "^0.2.6"
1450-
schema-utils "^2.6.5"
1451-
14521440
"@react-spring/animated@9.0.0-rc.3":
14531441
version "9.0.0-rc.3"
14541442
resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.0.0-rc.3.tgz#e792cb76aacecfc78db2be6020ac11ce96503eb5"
@@ -3880,14 +3868,6 @@ cssstyle@^2.2.0:
38803868
dependencies:
38813869
cssom "~0.3.6"
38823870

3883-
customize-cra-react-refresh@^1.1.0:
3884-
version "1.1.0"
3885-
resolved "https://registry.yarnpkg.com/customize-cra-react-refresh/-/customize-cra-react-refresh-1.1.0.tgz#0bb3723028b94d8f6f97af26b1f4aec0636271df"
3886-
integrity sha512-v7moZc3mv0ZnM9hUnC9YpUhjpWkCjYSL/oLx/y8o5CKFOnd3yOPxlmfMjrmpWTVPbpOIFTCPGjDIAiEYu63TGg==
3887-
dependencies:
3888-
"@pmmmwh/react-refresh-webpack-plugin" "^0.3.2"
3889-
react-refresh "^0.8.1"
3890-
38913871
customize-cra@^1.0.0:
38923872
version "1.0.0"
38933873
resolved "https://registry.yarnpkg.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d"
@@ -7058,11 +7038,6 @@ lodash._reinterpolate@^3.0.0:
70587038
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
70597039
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
70607040

7061-
lodash.debounce@^4.0.8:
7062-
version "4.0.8"
7063-
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
7064-
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
7065-
70667041
lodash.flow@^3.5.0:
70677042
version "3.5.0"
70687043
resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a"
@@ -9253,7 +9228,7 @@ react-reconciler@0.26.1:
92539228
object-assign "^4.1.1"
92549229
scheduler "^0.20.1"
92559230

9256-
react-refresh@^0.8.1, react-refresh@^0.8.3:
9231+
react-refresh@^0.8.3:
92579232
version "0.8.3"
92589233
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
92599234
integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==

src/Provider.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ type WorkerFrameMessage = {
3030
data: Buffers & {
3131
op: 'frame'
3232
observations: [string, any]
33-
active: boolean
33+
active: boolean,
34+
bodies?: string[]
3435
}
3536
}
36-
type WorkerSyncMessage = { data: { op: 'sync'; bodies: string[] } }
3737
export type WorkerCollideEvent = {
3838
data: {
3939
op: 'event'
@@ -79,7 +79,7 @@ export type WorkerRayhitEvent = {
7979
}
8080
}
8181
type WorkerEventMessage = WorkerCollideEvent | WorkerRayhitEvent
82-
type IncomingWorkerMessage = WorkerFrameMessage | WorkerSyncMessage | WorkerEventMessage
82+
type IncomingWorkerMessage = WorkerFrameMessage | WorkerEventMessage
8383

8484
export default function Provider({
8585
children,
@@ -143,6 +143,12 @@ export default function Provider({
143143
worker.onmessage = (e: IncomingWorkerMessage) => {
144144
switch (e.data.op) {
145145
case 'frame':
146+
if (e.data.bodies) {
147+
bodies.current = e.data.bodies.reduce(
148+
(acc, id) => ({ ...acc, [id]: (e.data as any).bodies.indexOf(id) }),
149+
{}
150+
)
151+
}
146152
buffers.positions = e.data.positions
147153
buffers.quaternions = e.data.quaternions
148154
e.data.observations.forEach(([id, value]) => subscriptions[id](value))
@@ -153,12 +159,6 @@ export default function Provider({
153159
}
154160
if (e.data.active) invalidate()
155161
break
156-
case 'sync':
157-
bodies.current = e.data.bodies.reduce(
158-
(acc, id) => ({ ...acc, [id]: (e.data as any).bodies.indexOf(id) }),
159-
{}
160-
)
161-
break
162162
case 'event':
163163
switch (e.data.type) {
164164
case 'collide':

src/worker.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ function createShape(type, args) {
5959
}
6060
}
6161

62+
let bodiesNeedSyncing = false
63+
6264
function syncBodies() {
63-
self.postMessage({ op: 'sync', bodies: world.bodies.map((body) => body.uuid) })
65+
bodiesNeedSyncing = true
6466
bodies = world.bodies.reduce((acc, body) => ({ ...acc, [body.uuid]: body }), {})
6567
}
6668

@@ -116,16 +118,18 @@ self.onmessage = (e) => {
116118
}
117119
observations.push([id, value])
118120
}
119-
self.postMessage(
120-
{
121-
op: 'frame',
122-
positions,
123-
quaternions,
124-
observations,
125-
active: world.hasActiveBodies,
126-
},
127-
[positions.buffer, quaternions.buffer]
128-
)
121+
const message = {
122+
op: 'frame',
123+
positions,
124+
quaternions,
125+
observations,
126+
active: world.hasActiveBodies,
127+
}
128+
if (bodiesNeedSyncing) {
129+
message.bodies = world.bodies.map((body) => body.uuid)
130+
bodiesNeedSyncing = false
131+
}
132+
self.postMessage(message, [positions.buffer, quaternions.buffer])
129133
break
130134
}
131135
case 'addBodies': {

0 commit comments

Comments
 (0)