Unified Timeline Rendering
+Tile-aware timeline rendering
LED 大屏投放平台
双 GPU 输出,统一时间轴
-左右服务器各自渲染半屏,但所有场景、动画、地图相机、视频时间都由同一个服务端时间轴驱动。
+双 GPU 本地渲染,统一时间轴同步
+左右输出端各自渲染半屏,但场景、动画、地图相机、视频时间由同一个服务端时间轴驱动。
能源驾驶舱
-适合 ECharts、Canvas、WebGL 地图和 Three.js 数字孪生。真实项目中应使用 camera.setViewOffset 做 tile-aware 渲染。
+适合 WebGL、Three.js、地图和视频组件。生产接入时使用同一 camera state 和 serverTime 渲染。
安防态势
-视频墙、告警卡片和地图联动都通过结构化动作同步触发,不在输出端执行任意远程脚本。
+视频墙、地图联动和告警卡片通过结构化动作同步触发,左右节点只按计划时间提交状态。
d?el(e,i,l,!0,!1,p):O(t,n,r,i,l,s,o,a,p)},X=(e,t,n,r,i,l,s,o,a)=>{let c=0,u=t.length,d=e.length-1,p=u-1;for(;c<=d&&c<=p;){let r=e[c],u=t[c]=a?ix(t[c]):iS(t[c]);if(ip(r,u))x(r,u,n,null,i,l,s,o,a);else break;c++}for(;c<=d&&c<=p;){let r=e[d],c=t[p]=a?ix(t[p]):iS(t[p]);if(ip(r,c))x(r,c,n,null,i,l,s,o,a);else break;d--,p--}if(c>d){if(c<=p){let e=p+1,d=ep)for(;c<=d;)ee(e[c],i,l,!0),c++;else{let h,f=c,m=c,g=new Map;for(c=m;c<=p;c++){let e=t[c]=a?ix(t[c]):iS(t[c]);null!=e.key&&g.set(e.key,c)}let y=0,b=p-m+1,S=!1,C=0,k=Array(b);for(c=0;c=b){ee(u,i,l,!0);continue}if(null!=u.key)r=g.get(u.key);else for(h=m;h<=p;h++)if(0===k[h-m]&&ip(u,t[h])){r=h;break}void 0===r?ee(u,i,l,!0):(k[r-m]=c+1,r>=C?C=r:S=!0,x(u,t[r],n,null,i,l,s,o,a),y++)}let T=S?function(e){let t,n,r,i,l,s=e.slice(),o=[0],a=e.length;for(t=0;t>1]]0&&(s[t]=o[r-1]),o[r]=t)}}for(r=o.length,i=o[r-1];r-- >0;)o[r]=i,i=s[i];return o}(k):_;for(h=T.length-1,c=b-1;c>=0;c--){let e=m+c,d=t[e],p=t[e+1],f=e+1{let{el:o,type:a,transition:c,children:u,shapeFlag:d}=e;if(6&d)return void Q(e.component.subTree,t,n,r);if(128&d)return void e.suspense.move(t,n,r);if(64&d)return void a.move(e,t,n,ec);if(a===r9){l(o,t,n);for(let e=0;e0&&ir.disconnect()},e.initCustomFormatter=function(){},e.initDirectivesForSSR=S,e.inject=r_,e.isMemoSame=iH,e.isProxy=t_,e.isReactive=tv,e.isReadonly=ty,e.isRef=tT,e.isRuntimeOnly=()=>!d,e.isShallow=tb,e.isVNode=id,e.markRaw=tx,e.mergeDefaults=function(e,t){let n=rl(e);for(let e in t){if(e.startsWith("__skip"))continue;let r=n[e];r?E(r)||P(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n},e.mergeModels=function(e,t){return e&&t?E(e)&&E(t)?e.concat(t):T({},rl(e),rl(t)):e||t},e.mergeProps=ik,e.nextTick=tY,e.normalizeClass=ec,e.normalizeProps=function(e){if(!e)return null;let{class:t,style:n}=e;return t&&!M(t)&&(e.class=ec(t)),n&&(e.style=ei(n)),e},e.normalizeStyle=ei,e.onActivated=nj,e.onBeforeMount=nG,e.onBeforeUnmount=nY,e.onBeforeUpdate=nQ,e.onDeactivated=nH,e.onErrorCaptured=n6,e.onMounted=nX,e.onRenderTracked=n3,e.onRenderTriggered=n2,e.onScopeDispose=function(e,t=!1){l&&l.cleanups.push(e)},e.onServerPrefetch=n1,e.onUnmounted=n0,e.onUpdated=nZ,e.onWatcherCleanup=tU,e.openBlock=il,e.popScopeId=function(){t5=null},e.provide=rb,e.proxyRefs=tO,e.pushScopeId=function(e){t5=e},e.queuePostFlushCb=t2,e.reactive=th,e.readonly=tm,e.ref=tN,e.registerRuntimeCompiler=i$,e.render=l0,e.renderList=function(e,t,n,r){let i,l=n&&n[r],s=E(e);if(s||M(e)){let n=s&&tv(e),r=!1,o=!1;n&&(r=!tb(e),o=ty(e),e=ez(e)),i=Array(e.length);for(let n=0,s=e.length;nt(e,n,void 0,l&&l[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,s=n.length;r!id(t)||t.type!==ie&&(t.type!==r9||!!e(t.children)))?t:null}(l(n)),o=n.key||s&&s.key,a=iu(r9,{key:(o&&!$(o)?o:`_${t}`)+(!s&&r?"_fb":"")},s||(r?r():[]),s&&1===e._?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),l&&l._c&&(l._d=!0),a},e.resolveComponent=function(e,t){return n5(n4,e,!0,t)||e},e.resolveDirective=function(e){return n5("directives",e)},e.resolveDynamicComponent=function(e){return M(e)?n5(n4,e,!1)||e:e||n8},e.resolveFilter=null,e.resolveTransitionHooks=n_,e.setBlockTracking=ia,e.setDevtoolsHook=S,e.setTransitionHooks=nC,e.shallowReactive=tf,e.shallowReadonly=function(e){return tg(e,!0,te,ta,tp)},e.shallowRef=tw,e.ssrContextKey=rj,e.ssrUtils=null,e.stop=function(e){e.effect.stop()},e.toDisplayString=ey,e.toHandlerKey=X,e.toHandlers=function(e,t){let n={};for(let r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:X(r)]=e[r];return n},e.toRaw=tS,e.toRef=function(e,t,n){return tT(e)?e:P(e)?new tL(e):L(e)&&arguments.length>1?tD(e,t,n):tN(e)},e.toRefs=function(e){let t=E(e)?Array(e.length):{};for(let n in e)t[n]=tD(e,n);return t},e.toValue=function(e){return P(e)?e():tI(e)},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){e.dep&&e.dep.trigger()},e.unref=tI,e.useAttrs=function(){return ri().attrs},e.useCssModule=function(e="$style"){return b},e.useCssVars=function(e){let t=iE();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>lo(e,n))},r=()=>{let r=e(t.proxy);t.ce?lo(t.ce,r):function e(t,n){if(128&t.shapeFlag){let r=t.suspense;t=r.activeBranch,r.pendingBranch&&!r.isHydrating&&r.effects.push(()=>{e(r.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)lo(t.el,n);else if(t.type===r9)t.children.forEach(t=>e(t,n));else if(t.type===it){let{el:e,anchor:r}=t;for(;e&&(lo(e,n),e!==r);)e=e.nextSibling}}(t.subTree,r),n(r)};nQ(()=>{t2(r)}),nX(()=>{rq(r,S,{flush:"post"});let e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),n0(()=>e.disconnect())})},e.useHost=lN,e.useId=function(){let e=iE();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""},e.useModel=function(e,t,n=b){let r=iE(),i=K(t),l=J(t),s=rz(e,i),o=tM((s,o)=>{let a,c,u=b;return rH(()=>{let t=e[i];Q(a,t)&&(a=t,o())}),{get:()=>(s(),n.get?n.get(a):a),set(e){let s=n.set?n.set(e):e;if(!Q(s,a)&&!(u!==b&&Q(e,u)))return;let d=r.vnode.props;d&&(t in d||i in d||l in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${l}`in d)||(a=e,o()),r.emit(`update:${t}`,s),Q(e,s)&&Q(e,u)&&!Q(s,c)&&o(),u=e,c=s}}});return o[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?s||b:o,done:!1}:{done:!0}}},o},e.useSSRContext=()=>{},e.useShadowRoot=function(){let e=lN();return e&&e.shadowRoot},e.useSlots=function(){return ri().slots},e.useTemplateRef=function(e){let t=iE(),n=tw(null);return t&&Object.defineProperty(t.refs===b?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n},e.useTransitionState=nh,e.vModelCheckbox=lB,e.vModelDynamic={created(e,t,n){lz(e,t,n,null,"created")},mounted(e,t,n){lz(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){lz(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){lz(e,t,n,r,"updated")}},e.vModelRadio=lj,e.vModelSelect=lH,e.vModelText=lV,e.vShow={beforeMount(e,{value:t},{transition:n}){e[lr]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):ll(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ll(e,!0),r.enter(e)):r.leave(e,()=>{ll(e,!1)}):ll(e,t))},beforeUnmount(e,{value:t}){ll(e,t)}},e.version=iq,e.warn=S,e.watch=function(e,t,n){return rq(e,t,n)},e.watchEffect=function(e,t){return rq(e,null,t)},e.watchPostEffect=function(e,t){return rq(e,null,{flush:"post"})},e.watchSyncEffect=rH,e.withAsyncContext=function(e){let t=iE(),n=e();return iR(),D(n)&&(n=n.catch(e=>{throw iI(t),e})),[n,()=>iI(t)]},e.withCtx=t7,e.withDefaults=function(e,t){return null},e.withDirectives=function(e,t){if(null===t8)return e;let n=iV(t8),r=e.dirs||(e.dirs=[]);for(let e=0;e