From 43279066304e8d38984b6101449df3d6a99b2f6a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 12 Dec 2017 16:39:49 +1300 Subject: [PATCH 1/3] Reduce communications load when making a user connection --- scripts/system/makeUserConnection.js | 94 ++++++++++++++++++---------- 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/scripts/system/makeUserConnection.js b/scripts/system/makeUserConnection.js index 7dddd46562..230a3d511b 100644 --- a/scripts/system/makeUserConnection.js +++ b/scripts/system/makeUserConnection.js @@ -111,10 +111,20 @@ var connectingHandJointIndex = -1; var waitingList = {}; var particleEffect; - var particleRotationAngle = 0.0; + var particleEmitRate; + var INITIAL_PARTICLE_EMIT_RATE = 500; + var MINIMUM_PARTICLE_EMIT_RATE = 50; + var PARTICLE_DECAY_RATE = 0.5; + var particleEffectUpdateTimer = null; + var PARTICLE_EFFECT_UPDATE_INTERVAL = 50; var makingConnectionParticleEffect; - var makingConnectionEmitRate = 2000; - var particleEmitRate = 500; + var makingConnectionEmitRate; + var isMakingConnectionEmitting; + var INITIAL_MAKING_CONNECTION_EMIT_RATE = 1000; + var MINIMUM_MAKING_CONNECTION_EMIT_RATE = 20; + var MAKING_CONNECTION_DECAY_RATE = 0.5; + var makingConnectionUpdateTimer = null; + var MAKING_CONNECTION_UPDATE_INTERVAL = 50; var handshakeInjector; var successfulHandshakeInjector; var handshakeSound; @@ -239,12 +249,20 @@ } function deleteParticleEffect() { + if (particleEffectUpdateTimer) { + Script.clearTimeout(particleEffectUpdateTimer); + particleEffectUpdateTimer = null; + } if (particleEffect) { particleEffect = Entities.deleteEntity(particleEffect); } } function deleteMakeConnectionParticleEffect() { + if (makingConnectionUpdateTimer) { + Script.clearTimeout(makingConnectionUpdateTimer); + makingConnectionUpdateTimer = null; + } if (makingConnectionParticleEffect) { makingConnectionParticleEffect = Entities.deleteEntity(makingConnectionParticleEffect); } @@ -257,15 +275,31 @@ } } - function calcParticlePos(myHandPosition, otherHandPosition, otherOrientation, reset) { - if (reset) { - particleRotationAngle = 0.0; + function updateMakingConnection() { + makingConnectionEmitRate = Math.max(makingConnectionEmitRate * MAKING_CONNECTION_DECAY_RATE, + MINIMUM_MAKING_CONNECTION_EMIT_RATE); + isMakingConnectionEmitting = true; + Entities.editEntity(makingConnectionParticleEffect, { + emitRate: makingConnectionEmitRate, + isEmitting: true + }); + if (makingConnectionEmitRate > MINIMUM_MAKING_CONNECTION_EMIT_RATE) { + makingConnectionUpdateTimer = Script.setTimeout(makingConnectionUpdateTimer, MAKING_CONNECTION_UPDATE_INTERVAL); + } else { + makingConnectionUpdateTimer = null; + } + } + + function updateParticleEffect() { + particleEmitRate = Math.max(MINIMUM_PARTICLE_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE); + Entities.editEntity(particleEffect, { + emitRate: particleEmitRate + }); + if (particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) { + particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL); + } else { + particleEffectUpdateTimer = null; } - var position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); - particleRotationAngle += PARTICLE_ANGLE_INCREMENT; // about 0.5 hz - var radius = Math.min(PARTICLE_RADIUS, PARTICLE_RADIUS * particleRotationAngle / 360); - var axis = Vec3.mix(Quat.getFront(MyAvatar.orientation), Quat.inverse(Quat.getFront(otherOrientation)), 0.5); - return Vec3.sum(position, Vec3.multiplyQbyV(Quat.angleAxis(particleRotationAngle, axis), {x: 0, y: radius, z: 0})); } // this is called frequently, but usually does nothing @@ -301,41 +335,35 @@ positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); // now manage the rest of the entity if (!particleEffect) { - particleRotationAngle = 0.0; - particleEmitRate = 500; + particleEmitRate = INITIAL_PARTICLE_EMIT_RATE; particleProps = PARTICLE_EFFECT_PROPS; - particleProps.isEmitting = 0; - particleProps.position = calcParticlePos(myHandPosition, otherHandPosition, otherOrientation); + particleProps.position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); particleProps.parentID = MyAvatar.sessionUUID; particleEffect = Entities.addEntity(particleProps, true); - } else { - particleProps.position = calcParticlePos(myHandPosition, otherHandPosition, otherOrientation); - particleProps.isEmitting = 1; - Entities.editEntity(particleEffect, particleProps); } if (!makingConnectionParticleEffect) { var props = MAKING_CONNECTION_PARTICLE_PROPS; props.parentID = MyAvatar.sessionUUID; - makingConnectionEmitRate = 2000; + makingConnectionEmitRate = INITIAL_MAKING_CONNECTION_EMIT_RATE; props.emitRate = makingConnectionEmitRate; + props.isEmitting = false; props.position = myHandPosition; makingConnectionParticleEffect = Entities.addEntity(props, true); - } else { - makingConnectionEmitRate *= 0.5; - Entities.editEntity(makingConnectionParticleEffect, { - emitRate: makingConnectionEmitRate, - position: myHandPosition, - isEmitting: true - }); + makingConnectionUpdateTimer = Script.setTimeout(updateMakingConnection, MAKING_CONNECTION_UPDATE_INTERVAL); } break; case STATES.MAKING_CONNECTION: - particleEmitRate = Math.max(50, particleEmitRate * 0.5); - Entities.editEntity(makingConnectionParticleEffect, {emitRate: 0, isEmitting: 0, position: myHandPosition}); - Entities.editEntity(particleEffect, { - position: calcParticlePos(myHandPosition, otherHandPosition, otherOrientation), - emitRate: particleEmitRate - }); + if (makingConnectionUpdateTimer) { + Script.clearTimeout(makingConnectionUpdateTimer); + makingConnectionUpdateTimer = null; + } + if (isMakingConnectionEmitting) { + Entities.editEntity(makingConnectionParticleEffect, { isEmitting: false }); + isMakingConnectionEmitting = false; + } + if (!particleEffectUpdateTimer && particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) { + particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL); + } break; default: debug("unexpected state", state); From 380cd7aac6d322ca49171b02a173e019eea0321f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 12 Dec 2017 17:35:37 +1300 Subject: [PATCH 2/3] Tune particle effects to be similar to before --- scripts/system/makeUserConnection.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/scripts/system/makeUserConnection.js b/scripts/system/makeUserConnection.js index 230a3d511b..604ed65951 100644 --- a/scripts/system/makeUserConnection.js +++ b/scripts/system/makeUserConnection.js @@ -46,7 +46,7 @@ var PARTICLE_EFFECT_PROPS = { "alpha": 0.8, "azimuthFinish": Math.PI, - "azimuthStart": -1 * Math.PI, + "azimuthStart": -Math.PI, "emitRate": 500, "emitSpeed": 0.0, "emitterShouldTrail": 1, @@ -54,17 +54,19 @@ "lifespan": 3, "maxParticles": 1000, "particleRadius": 0.003, - "polarStart": 1, - "polarFinish": 1, + "polarStart": Math.PI / 2, + "polarFinish": Math.PI / 2, "radiusFinish": 0.008, "radiusStart": 0.0025, - "speedSpread": 0.025, + "emitSpeed": 0.02, + "speedSpread": 0.015, "textures": "http://hifi-content.s3.amazonaws.com/alan/dev/Particles/Bokeh-Particle.png", "color": {"red": 255, "green": 255, "blue": 255}, "colorFinish": {"red": 0, "green": 164, "blue": 255}, "colorStart": {"red": 255, "green": 255, "blue": 255}, "emitOrientation": {"w": -0.71, "x": 0.0, "y": 0.0, "z": 0.71}, "emitAcceleration": {"x": 0.0, "y": 0.0, "z": 0.0}, + "emitDimensions": { "x": 0.15, "y": 0.15, "z": 0.01 }, "accelerationSpread": {"x": 0.0, "y": 0.0, "z": 0.0}, "dimensions": {"x": 0.05, "y": 0.05, "z": 0.05}, "type": "ParticleEffect" @@ -112,19 +114,19 @@ var waitingList = {}; var particleEffect; var particleEmitRate; - var INITIAL_PARTICLE_EMIT_RATE = 500; + var INITIAL_PARTICLE_EMIT_RATE = 250; var MINIMUM_PARTICLE_EMIT_RATE = 50; var PARTICLE_DECAY_RATE = 0.5; var particleEffectUpdateTimer = null; - var PARTICLE_EFFECT_UPDATE_INTERVAL = 50; + var PARTICLE_EFFECT_UPDATE_INTERVAL = 200; var makingConnectionParticleEffect; var makingConnectionEmitRate; var isMakingConnectionEmitting; - var INITIAL_MAKING_CONNECTION_EMIT_RATE = 1000; + var INITIAL_MAKING_CONNECTION_EMIT_RATE = 500; var MINIMUM_MAKING_CONNECTION_EMIT_RATE = 20; var MAKING_CONNECTION_DECAY_RATE = 0.5; var makingConnectionUpdateTimer = null; - var MAKING_CONNECTION_UPDATE_INTERVAL = 50; + var MAKING_CONNECTION_UPDATE_INTERVAL = 200; var handshakeInjector; var successfulHandshakeInjector; var handshakeSound; @@ -338,6 +340,8 @@ particleEmitRate = INITIAL_PARTICLE_EMIT_RATE; particleProps = PARTICLE_EFFECT_PROPS; particleProps.position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); + particleProps.rotation = Vec3.mix(Quat.getFront(MyAvatar.orientation), + Quat.inverse(Quat.getFront(otherOrientation)), 0.5); particleProps.parentID = MyAvatar.sessionUUID; particleEffect = Entities.addEntity(particleProps, true); } From 25214aad2368f2e9099fb5621fa1990abd2b281c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 13 Dec 2017 08:56:36 +1300 Subject: [PATCH 3/3] Code review --- scripts/system/makeUserConnection.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/scripts/system/makeUserConnection.js b/scripts/system/makeUserConnection.js index 604ed65951..392ff3c0b5 100644 --- a/scripts/system/makeUserConnection.js +++ b/scripts/system/makeUserConnection.js @@ -48,7 +48,6 @@ "azimuthFinish": Math.PI, "azimuthStart": -Math.PI, "emitRate": 500, - "emitSpeed": 0.0, "emitterShouldTrail": 1, "isEmitting": 1, "lifespan": 3, @@ -114,16 +113,16 @@ var waitingList = {}; var particleEffect; var particleEmitRate; - var INITIAL_PARTICLE_EMIT_RATE = 250; - var MINIMUM_PARTICLE_EMIT_RATE = 50; + var PARTICLE_INITIAL_EMIT_RATE = 250; + var PARTICLE_MINIMUM_EMIT_RATE = 50; var PARTICLE_DECAY_RATE = 0.5; var particleEffectUpdateTimer = null; var PARTICLE_EFFECT_UPDATE_INTERVAL = 200; var makingConnectionParticleEffect; var makingConnectionEmitRate; var isMakingConnectionEmitting; - var INITIAL_MAKING_CONNECTION_EMIT_RATE = 500; - var MINIMUM_MAKING_CONNECTION_EMIT_RATE = 20; + var MAKING_CONNECTION_INITIAL_EMIT_RATE = 500; + var MAKING_CONNECTION_MINIMUM_EMIT_RATE = 20; var MAKING_CONNECTION_DECAY_RATE = 0.5; var makingConnectionUpdateTimer = null; var MAKING_CONNECTION_UPDATE_INTERVAL = 200; @@ -279,13 +278,13 @@ function updateMakingConnection() { makingConnectionEmitRate = Math.max(makingConnectionEmitRate * MAKING_CONNECTION_DECAY_RATE, - MINIMUM_MAKING_CONNECTION_EMIT_RATE); + MAKING_CONNECTION_MINIMUM_EMIT_RATE); isMakingConnectionEmitting = true; Entities.editEntity(makingConnectionParticleEffect, { emitRate: makingConnectionEmitRate, isEmitting: true }); - if (makingConnectionEmitRate > MINIMUM_MAKING_CONNECTION_EMIT_RATE) { + if (makingConnectionEmitRate > MAKING_CONNECTION_MINIMUM_EMIT_RATE) { makingConnectionUpdateTimer = Script.setTimeout(makingConnectionUpdateTimer, MAKING_CONNECTION_UPDATE_INTERVAL); } else { makingConnectionUpdateTimer = null; @@ -293,11 +292,11 @@ } function updateParticleEffect() { - particleEmitRate = Math.max(MINIMUM_PARTICLE_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE); + particleEmitRate = Math.max(PARTICLE_MINIMUM_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE); Entities.editEntity(particleEffect, { emitRate: particleEmitRate }); - if (particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) { + if (particleEmitRate > PARTICLE_MINIMUM_EMIT_RATE) { particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL); } else { particleEffectUpdateTimer = null; @@ -337,7 +336,7 @@ positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); // now manage the rest of the entity if (!particleEffect) { - particleEmitRate = INITIAL_PARTICLE_EMIT_RATE; + particleEmitRate = PARTICLE_INITIAL_EMIT_RATE; particleProps = PARTICLE_EFFECT_PROPS; particleProps.position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5); particleProps.rotation = Vec3.mix(Quat.getFront(MyAvatar.orientation), @@ -348,7 +347,7 @@ if (!makingConnectionParticleEffect) { var props = MAKING_CONNECTION_PARTICLE_PROPS; props.parentID = MyAvatar.sessionUUID; - makingConnectionEmitRate = INITIAL_MAKING_CONNECTION_EMIT_RATE; + makingConnectionEmitRate = MAKING_CONNECTION_INITIAL_EMIT_RATE; props.emitRate = makingConnectionEmitRate; props.isEmitting = false; props.position = myHandPosition; @@ -365,7 +364,7 @@ Entities.editEntity(makingConnectionParticleEffect, { isEmitting: false }); isMakingConnectionEmitting = false; } - if (!particleEffectUpdateTimer && particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) { + if (!particleEffectUpdateTimer && particleEmitRate > PARTICLE_MINIMUM_EMIT_RATE) { particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL); } break;