zhouenguang пре 3 година
родитељ
комит
777becd9fd
2 измењених фајлова са 54 додато и 35 уклоњено
  1. 37 26
      src/Signal.js
  2. 17 9
      src/XAvatar.js

+ 37 - 26
src/Signal.js

@@ -40,14 +40,16 @@ export default class Signal {
     
     handleSignal(updateData, i) {
         if (!this.signalHandleActived) return;
+
         const time1 = Date.now()
         const { signal, alreadyUpdateYUV } = updateData;
-
         this.handleActionResponses(signal), this._room.handleSignalHook(signal);
-        const time2 = Date.now();
 
-        if (this.handleSignalPartialArray2.add(time2 - time1), !alreadyUpdateYUV) 
+        const time2 = Date.now();
+        this.handleSignalPartialArray2.add(time2 - time1);
+        if (!alreadyUpdateYUV) 
         {
+            // 断流时,人物停止移动
             const mainUserState = signal.newUserStates && signal.newUserStates.find(state => state.userId === this._room.userId);
             if ((mainUserState && mainUserState.renderInfo) && (this._room._userAvatar && this._room._userAvatar.isMoving)) 
             {
@@ -62,6 +64,7 @@ export default class Signal {
             return
         }
 
+        // 数据过滤
         this.isUpdatedYUV = alreadyUpdateYUV;
         if (!signal) {
             logger.warn("metadata signal is empty");
@@ -75,28 +78,31 @@ export default class Signal {
             this._room.handleRepetLogin();
             return
         }
-
         if (
             signal.code !== void 0 && 
             signal.code !== Codes.Success && 
             signal.code !== Codes.ActionMaybeDelay && 
             signal.code !== Codes.DoActionBlocked && 
             signal.code !== Codes.GetOnVehicle
-        )
-            if (signal.code === Codes.UnReachable) 
-                logger.debug("signal errcode: ", signal.code), this._room.proxyEvents("unreachable");
-            else {
+        ) {
+            if (signal.code === Codes.UnReachable) {
+                logger.debug("signal errcode: ", signal.code);
+                this._room.proxyEvents("unreachable");
+            } else {
                 if (!this._room.joined) {
-                    const nt = getErrorByCode(signal.code),
-                        ot = new nt(signal.msg);
-                    i(ot)
+                    const CodeError = getErrorByCode(signal.code),
+                        error = new CodeError(signal.msg);
+                    i(error)
                 }
-                logger.error("signal errcode: ", signal), this._room.emit("error", signal)
+                logger.error("signal errcode: ", signal);
+                this._room.emit("error", signal);
             } 
+        }
         
         const time3 = Date.now();
         this.handleSignalPartialArray3.add(time3 - time2);
         const mainUserState = signal.newUserStates && signal.newUserStates.find(state => state.userId === this._room.userId);
+        // Broadcast相关 暂时用不到
         if (signal.broadcastAction) try {
             const nt = JSON.parse(signal.broadcastAction.data);
             Broadcast.handlers.forEach(ot => ot(nt))
@@ -105,11 +111,13 @@ export default class Signal {
         }
 
         const time4 = Date.now();
-        this.handleSignalPartialArray4.add(time4 - time3), 
+        this.handleSignalPartialArray4.add(time4 - time3);
+        // 更新人物数据
         signal.newUserStates && signal.newUserStates.length > 0 && this._room.avatarManager.handleAvatar(signal);
 
         const time5 = Date.now();
-        if (this.handleSignalPartialArray5.add(time5 - time4), mainUserState != null && mainUserState.playerState) {
+        this.handleSignalPartialArray5.add(time5 - time4);
+        if (mainUserState != null && mainUserState.playerState) {
             this._room._currentClickingState = mainUserState.playerState;
             const { pathName, attitude, areaName, skinId } = mainUserState.playerState;
             if (
@@ -123,27 +131,30 @@ export default class Signal {
                 this._room.pathManager.currentAttitude = attitude, 
                 this._room._userAvatar && (this._room._userAvatar.motionType = attitude)
             }
-            this._room.sceneManager.getCurrentShaderMode() !== ECurrentShaderMode.pano && 
-            !this._room.isPano && 
-            mainUserState.playerState.camera && 
-            !this._room.panorama.isLoading && 
-            this._room.camera.setCameraPose(mainUserState.playerState.camera)
+            // 更新相机数据
+            this._room.sceneManager.getCurrentShaderMode() !== ECurrentShaderMode.pano 
+            && !this._room.isPano 
+            && mainUserState.playerState.camera 
+            && !this._room.panorama.isLoading 
+            && this._room.camera.setCameraPose(mainUserState.playerState.camera)
         }
         mainUserState != null && mainUserState.renderInfo && this._room.camera.handleRenderInfo(mainUserState);
 
         const time6 = Date.now();
-        if (this.handleSignalPartialArray6.add(time6 - time5), signal.actionType !== void 0) {
+        this.handleSignalPartialArray6.add(time6 - time5);
+        if (signal.actionType !== void 0) {
             const { actionType, code, echoMsg, traceId } = signal;
-            actionType === Actions.Echo && 
-            code === Codes.Success && 
-            this._room.networkController.rtcp.heartbeat.pong(echoMsg, traceId), 
-            code !== Codes.Success ? eventsManager.remove(traceId, code) : [
+            // 移除暂存的traceId
+            actionType === Actions.Echo 
+            && code === Codes.Success 
+            && this._room.networkController.rtcp.heartbeat.pong(echoMsg, traceId)
+            , code !== Codes.Success ? eventsManager.remove(traceId, code) : [
                     Actions.GetReserveStatus, Actions.Broadcast, Actions.ChangeNickname, Actions.ConfirmEvent, 
                     Actions.ReserveSeat, Actions.Rotation, Actions.TurnTo, Actions.RotateTo, Actions.SetPlayerState, 
                     Actions.GetNeighborPoints, Actions.TurnToFace, Actions.AudienceChangeToVisitor, Actions.RemoveVisitor, 
                     Actions.GetUserWithAvatar, Actions.GetNewUserState, Actions.SetSyncPolicy
-                ].includes(actionType) && 
-            eventsManager.remove(traceId, code, signal)
+                ].includes(actionType)
+            && eventsManager.remove(traceId, code, signal)
         }
 
         const time7 = Date.now();

+ 17 - 9
src/XAvatar.js

@@ -231,7 +231,7 @@ export default class XAvatar {
         const e = avatarLoader.avaliableAnimation.get(this.avatarType);
         return e || []
     }
-    //i用于控制是否接触地面
+    // todo i用于控制是否接触地面。目前设默认为true,实时检测模型地面高度
     setPosition(e, i=!0) {
         this._avatarPosition = e;
         if (this.rootNode) {
@@ -243,14 +243,22 @@ export default class XAvatar {
                     o.subtract(this._previousReceivedPosition).length() > castRayTeleportationOffset && (s = !0)
                 }
             }
-            this._isRayCastEnable ? s || i ? this._castRay(e).then(c=>{
-                this.rootNode.position = o;
-                this.rootNode.position.y -= c;
-            }
-            ).catch(c=>{
-                Promise.reject(c)
-            }) : (this.rootNode.position.x = o.x,
-            this.rootNode.position.z = o.z) : this.rootNode.position = o,
+            if(this._isRayCastEnable) 
+                if(s || i) {
+                    // 检测模型地面高度
+                    this._castRay(e).then(c=>{
+                        this.rootNode.position = o;
+                        this.rootNode.position.y -= c;
+                    }
+                    ).catch(c=>{
+                        Promise.reject(c)
+                    }) 
+                } else {
+                    // 保持人物高度不变
+                    this.rootNode.position.x = o.x
+                    this.rootNode.position.z = o.z
+                }
+            else this.rootNode.position = o
             this._previousReceivedPosition = o.clone()
         }
         return Promise.resolve(e)