-
-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: slow post message #623
Changes from all commits
35aa620
b4e2680
322385e
8b65f6b
e509a0d
2d1c9b0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -9,42 +9,105 @@ async function start() { | |||||||||||||||||||||
const store = require("./store").default; | ||||||||||||||||||||||
const loop = require("./loop").default; | ||||||||||||||||||||||
const grabCanvasPlugin = require("../plugins/grab-canvas").default; | ||||||||||||||||||||||
const get = require("lodash.get"); | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { tick: frameTick } = require("./frame-counter"); | ||||||||||||||||||||||
const { getFeatures, setFeatures } = require("./audio-features"); | ||||||||||||||||||||||
// const featureAssignmentPlugin = require("../plugins/feature-assignment"); | ||||||||||||||||||||||
|
||||||||||||||||||||||
let interval = store.getters["fps/interval"]; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const commitQueue = []; | ||||||||||||||||||||||
|
||||||||||||||||||||||
store.subscribe(mutation => { | ||||||||||||||||||||||
const { type, payload } = mutation; | ||||||||||||||||||||||
const { type: mutationType, payload: mutationPayload } = mutation; | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (type === "beats/SET_BPM" || type === "fps/SET_FPS") { | ||||||||||||||||||||||
store.dispatch("tweens/updateBpm", { bpm: payload.bpm }); | ||||||||||||||||||||||
if (mutationType === "beats/SET_BPM" || mutationType === "fps/SET_FPS") { | ||||||||||||||||||||||
store.dispatch("tweens/updateBpm", { bpm: mutationPayload.bpm }); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (type === "beats/SET_KICK" && payload.kick === lastKick) { | ||||||||||||||||||||||
if ( | ||||||||||||||||||||||
mutationType === "beats/SET_KICK" && | ||||||||||||||||||||||
mutationPayload.kick === lastKick | ||||||||||||||||||||||
) { | ||||||||||||||||||||||
return; | ||||||||||||||||||||||
} else if (type === "beats/SET_KICK" && payload.kick !== lastKick) { | ||||||||||||||||||||||
lastKick = payload.kick; | ||||||||||||||||||||||
} else if ( | ||||||||||||||||||||||
mutationType === "beats/SET_KICK" && | ||||||||||||||||||||||
mutationPayload.kick !== lastKick | ||||||||||||||||||||||
) { | ||||||||||||||||||||||
lastKick = mutationPayload.kick; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (type === "fps/SET_FPS") { | ||||||||||||||||||||||
if (mutationType === "fps/SET_FPS") { | ||||||||||||||||||||||
interval = store.getters["fps/interval"]; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
if ( | ||||||||||||||||||||||
type === "modules/UPDATE_ACTIVE_MODULE" && | ||||||||||||||||||||||
(payload.key !== "props" || payload.key !== "meta") | ||||||||||||||||||||||
mutationType === "modules/UPDATE_ACTIVE_MODULE" && | ||||||||||||||||||||||
(mutationPayload.key !== "props" || mutationPayload.key !== "meta") | ||||||||||||||||||||||
) { | ||||||||||||||||||||||
return; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { | ||||||||||||||||||||||
inputs: { inputs, inputLinks } | ||||||||||||||||||||||
} = store.state; | ||||||||||||||||||||||
|
||||||||||||||||||||||
// Update mutation type Input Links | ||||||||||||||||||||||
const mutationTypeInputLinks = Object.values(inputLinks).filter( | ||||||||||||||||||||||
link => link.type === "mutation" | ||||||||||||||||||||||
); | ||||||||||||||||||||||
const inputLinksLength = mutationTypeInputLinks.length; | ||||||||||||||||||||||
for (let i = 0; i < inputLinksLength; ++i) { | ||||||||||||||||||||||
const link = mutationTypeInputLinks[i]; | ||||||||||||||||||||||
const inputId = link.id; | ||||||||||||||||||||||
const bind = inputs[inputId]; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { type, location, data } = bind; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { location: linkLocation, match } = link; | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (match.type !== mutationType) { | ||||||||||||||||||||||
continue; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
let payloadMatches = false; | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (match.payload) { | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||||
const matchPayloadKeys = Object.keys(match.payload); | ||||||||||||||||||||||
payloadMatches = matchPayloadKeys.every(key => { | ||||||||||||||||||||||
const value = match.payload[key]; | ||||||||||||||||||||||
return value === mutationPayload[key]; | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
} else { | ||||||||||||||||||||||
payloadMatches = true; | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Because it's possible for mutations to have no payload, or we just want to update when a mutation, e.g. Example here: modV/src/components/InputLinkComponents/AudioFeatures.vue Lines 123 to 132 in 322385e
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (!payloadMatches) { | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we have no payloadMatch, we continue? Why do we check if the payload is matching anyway? To see if there was a change? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The payload may need to match to check for things like IDs or other unique parameters so we know the correct inputLink will be updated. If we didn't check for the right ID on the MIDI input links, all MIDI input links would update on any MIDI input which would be wasteful in terms of postMessage. |
||||||||||||||||||||||
continue; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
const value = get(store.state, linkLocation); | ||||||||||||||||||||||
|
||||||||||||||||||||||
if (type === "action") { | ||||||||||||||||||||||
store.dispatch(location, { ...data, data: value }); | ||||||||||||||||||||||
} else if (type === "commit") { | ||||||||||||||||||||||
store.commit(location, { ...data, data: value }); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
commitQueue.push(mutation); | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
|
||||||||||||||||||||||
function sendCommitQueue() { | ||||||||||||||||||||||
const commits = JSON.stringify(commitQueue); | ||||||||||||||||||||||
commitQueue.splice(0, commitQueue.length); | ||||||||||||||||||||||
|
||||||||||||||||||||||
self.postMessage({ | ||||||||||||||||||||||
type, | ||||||||||||||||||||||
payload: JSON.stringify(payload) | ||||||||||||||||||||||
type: "commitQueue", | ||||||||||||||||||||||
payload: commits | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
store.dispatch("plugins/add", grabCanvasPlugin); | ||||||||||||||||||||||
|
||||||||||||||||||||||
|
@@ -177,6 +240,7 @@ async function start() { | |||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
function frameActions(delta) { | ||||||||||||||||||||||
sendCommitQueue(); | ||||||||||||||||||||||
self.postMessage({ | ||||||||||||||||||||||
type: "tick", | ||||||||||||||||||||||
payload: delta | ||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is an input link of type
mutation
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are multiple types of input links.
?args
, and applies that to the input link defined withinputId
meyda/getFeature
["energy"]
match.type
, possibly checks the mutation payload for specific unique parameters, defined onmatch.?payload
, and applies a store value, specified withlocation
, to the input link defined withinputId
midi.devices[1].channelData[1][144]
midi/WRITE_DATA
inputId
midi.devices[1].channelData[1][144]
state and getter links are updated in loop.js
modV/src/application/worker/loop.js
Line 89 in 322385e
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@2xAA thanks for this explanation!