{"id":41581,"date":"2025-06-03T23:27:21","date_gmt":"2025-06-03T15:27:21","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/41581.html"},"modified":"2025-06-03T23:27:21","modified_gmt":"2025-06-03T15:27:21","slug":"%e5%8f%af%e8%a7%86%e5%8c%96%e4%b8%8e%e5%8a%a8%e7%94%bb%ef%bc%9a%e6%9e%84%e5%bb%ba%e6%b2%89%e6%b5%b8%e5%bc%8fvue%e5%ba%94%e7%94%a8%e7%9a%84%e8%bf%9b%e9%98%b6%e5%ae%9e%e8%b7%b5","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/41581.html","title":{"rendered":"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5"},"content":{"rendered":"<p>\u5728\u73b0\u4ee3Web\u5e94\u7528\u4e2d&#xff0c;\u9ad8\u6027\u80fd\u53ef\u89c6\u5316\u548c\u6d41\u7545\u52a8\u753b\u5df2\u6210\u4e3a\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u7684\u6838\u5fc3\u8981\u7d20\u3002\u672c\u8282\u5c06\u6df1\u5165\u63a2\u7d22Vue\u751f\u6001\u4e2d\u7684\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\u6280\u672f&#xff0c;\u5206\u4eab\u4e13\u4e1a\u7ea7\u89e3\u51b3\u65b9\u6848\u4e0e\u6700\u4f73\u5b9e\u8df5\u3002<\/p>\n<h2>\u4e00\u3001 Canvas\u9ad8\u6027\u80fd\u6e32\u67d3\u4f53\u7cfb<\/h2>\n<h3>01\u3001Konva.js\u6d41\u7a0b\u56fe\u5f15\u64ce\u6df1\u5ea6\u4f18\u5316<\/h3>\n<p>&lt;template&gt;<br \/>\n  &lt;div class&#061;&#034;flow-editor&#034;&gt;<br \/>\n    &lt;v-stage :config&#061;&#034;stageConfig&#034; &#064;wheel&#061;&#034;handleZoom&#034;&gt;<br \/>\n      &lt;v-layer ref&#061;&#034;canvasLayer&#034;&gt;<br \/>\n        &lt;!&#8211; \u8282\u70b9\u6e32\u67d3 &#8211;&gt;<br \/>\n        &lt;v-rect<br \/>\n          v-for&#061;&#034;node in nodes&#034;<br \/>\n          :key&#061;&#034;node.id&#034;<br \/>\n          :config&#061;&#034;node.config&#034;<br \/>\n          &#064;dragmove&#061;&#034;handleNodeMove&#034;<br \/>\n          &#064;click&#061;&#034;selectNode(node)&#034;<br \/>\n        \/&gt;<\/p>\n<p>        &lt;!&#8211; \u8fde\u63a5\u7ebf &#8211;&gt;<br \/>\n        &lt;v-line<br \/>\n          v-for&#061;&#034;conn in connections&#034;<br \/>\n          :key&#061;&#034;conn.id&#034;<br \/>\n          :config&#061;&#034;calcLineConfig(conn)&#034;<br \/>\n          stroke&#061;&#034;#3498db&#034;<br \/>\n          strokeWidth&#061;{2}<br \/>\n        \/&gt;<br \/>\n      &lt;\/v-layer&gt;<\/p>\n<p>      &lt;!&#8211; \u52a8\u6001\u5de5\u5177\u5c42 &#8211;&gt;<br \/>\n      &lt;v-layer ref&#061;&#034;toolLayer&#034;&gt;<br \/>\n        &lt;selection-box v-if&#061;&#034;selection&#034; :config&#061;&#034;selection&#034; \/&gt;<br \/>\n      &lt;\/v-layer&gt;<br \/>\n    &lt;\/v-stage&gt;<\/p>\n<p>    &lt;!&#8211; \u8282\u70b9\u5c5e\u6027\u9762\u677f &#8211;&gt;<br \/>\n    &lt;node-property-panel :node&#061;&#034;selectedNode&#034; \/&gt;<br \/>\n  &lt;\/div&gt;<br \/>\n&lt;\/template&gt;<\/p>\n<p>&lt;script&gt;<br \/>\nimport { reactive, ref } from &#039;vue&#039;;<br \/>\nimport { Stage, Layer, Rect, Line } from &#039;vue-konva&#039;;<\/p>\n<p>export default {<br \/>\n  components: { VStage: Stage, VLayer: Layer, VRect: Rect, VLine: Line },<br \/>\n  setup() {<br \/>\n    const nodes &#061; reactive([<br \/>\n      {<br \/>\n        id: &#039;node1&#039;,<br \/>\n        config: { x: 100, y: 50, width: 120, height: 60, fill: &#039;#9b59b6&#039; },<br \/>\n        type: &#039;input&#039;<br \/>\n      },<br \/>\n      \/\/ &#8230;\u66f4\u591a\u8282\u70b9<br \/>\n    ]);<\/p>\n<p>    \/\/ \u4f7f\u7528\u5171\u4eab\u6570\u636e\u6c60\u4f18\u5316\u6027\u80fd<br \/>\n    const connections &#061; computed(() &#061;&gt; {<br \/>\n      const conns &#061; [];<br \/>\n      nodes.forEach(source &#061;&gt; {<br \/>\n        source.outputs?.forEach(targetId &#061;&gt; {<br \/>\n          const target &#061; nodes.find(n &#061;&gt; n.id &#061;&#061;&#061; targetId);<br \/>\n          conns.push({<br \/>\n            id: &#096;${source.id}-${targetId}&#096;,<br \/>\n            points: calcConnectionPoints(source, target)<br \/>\n          });<br \/>\n        });<br \/>\n      });<br \/>\n      return conns;<br \/>\n    });<\/p>\n<p>    \/\/ \u89c6\u53e3\u53d8\u6362\u4f18\u5316<br \/>\n    const stageConfig &#061; reactive({ width: 1200, height: 800, scale: 1 });<br \/>\n    const lastPos &#061; ref({ x: 0, y: 0 });<\/p>\n<p>    const handleZoom &#061; (e) &#061;&gt; {<br \/>\n      e.evt.preventDefault();<br \/>\n      const scaleBy &#061; 1.1;<br \/>\n      const stage &#061; e.target.getStage();<br \/>\n      const oldScale &#061; stage.scaleX();<br \/>\n      const pointer &#061; stage.getPointerPosition();<\/p>\n<p>      const newScale &#061; e.evt.deltaY &gt; 0 ?<br \/>\n        oldScale * scaleBy :<br \/>\n        oldScale \/ scaleBy;<\/p>\n<p>      stage.scale({ x: newScale, y: newScale });<\/p>\n<p>      \/\/ \u8ba1\u7b97\u504f\u79fb\u4fdd\u6301\u4e2d\u5fc3\u70b9\u7a33\u5b9a<br \/>\n      const mousePointTo &#061; {<br \/>\n        x: (pointer.x &#8211; stage.x()) \/ oldScale,<br \/>\n        y: (pointer.y &#8211; stage.y()) \/ oldScale<br \/>\n      };<\/p>\n<p>      stage.position({<br \/>\n        x: pointer.x &#8211; mousePointTo.x * newScale,<br \/>\n        y: pointer.y &#8211; mousePointTo.y * newScale<br \/>\n      });<br \/>\n    };<\/p>\n<p>    return { nodes, connections, stageConfig, handleZoom };<br \/>\n  }<br \/>\n};<br \/>\n&lt;\/script&gt;<\/p>\n<p>\u6027\u80fd\u4f18\u5316\u6280\u5de7&#xff1a;<\/p>\n<li>\u5206\u5c42\u6e32\u67d3&#xff1a;\u9759\u6001\u5143\u7d20\u4e0e\u52a8\u6001\u5143\u7d20\u5206\u79bb\u56fe\u5c42<\/li>\n<li>\u6279\u91cf\u66f4\u65b0&#xff1a;\u4f7f\u7528Konva.FastLayer\u6279\u91cf\u7ed8\u5236\u64cd\u4f5c<\/li>\n<li>\u865a\u62df\u5316\u6e32\u67d3&#xff1a;\u4ec5\u6e32\u67d3\u89c6\u53e3\u5185\u53ef\u89c1\u5143\u7d20<\/li>\n<li>\u7f13\u5b58\u7b56\u7565&#xff1a;\u5bf9\u590d\u6742\u8282\u70b9\u8c03\u7528node.cache()<\/li>\n<li>GPU\u52a0\u901f&#xff1a;\u542f\u7528{ willReadFrequently: false }\u9009\u9879<\/li>\n<p>\u4e0b\u9762\u662f\u5b8c\u6574\u7684\u5b9e\u73b0\u65b9\u6848&#xff1a;<\/p>\n<p><span class=\"token doctype\"><span class=\"token punctuation\">&lt;!<\/span><span class=\"token doctype-tag\">DOCTYPE<\/span> <span class=\"token name\">html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>html<\/span> <span class=\"token attr-name\">lang<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>zh-CN<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>meta<\/span> <span class=\"token attr-name\">charset<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>UTF-8<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>meta<\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>viewport<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">content<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>width&#061;device-width, initial-scale&#061;1.0<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>title<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>Konva.js\u6d41\u7a0b\u56fe\u5f15\u64ce\u6df1\u5ea6\u4f18\u5316<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>title<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>script<\/span> <span class=\"token attr-name\">src<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>https:\/\/unpkg.com\/vue&#064;3\/dist\/vue.global.js<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token script\"><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>script<\/span> <span class=\"token attr-name\">src<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>https:\/\/unpkg.com\/konva&#064;8\/konva.min.js<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token script\"><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>style<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token style\"><span class=\"token language-css\"><br \/>\n        <span class=\"token selector\">*<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">margin<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">box-sizing<\/span><span class=\"token punctuation\">:<\/span> border-box<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-family<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;Segoe UI&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;Microsoft YaHei&#039;<\/span><span class=\"token punctuation\">,<\/span> sans-serif<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">body<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #1a2a6c<span class=\"token punctuation\">,<\/span> #2c3e50<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #ecf0f1<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">min-height<\/span><span class=\"token punctuation\">:<\/span> 100vh<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">overflow<\/span><span class=\"token punctuation\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.container<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">max-width<\/span><span class=\"token punctuation\">:<\/span> 1800px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">margin<\/span><span class=\"token punctuation\">:<\/span> 0 auto<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">height<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">calc<\/span><span class=\"token punctuation\">(<\/span>100vh &#8211; 40px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>30<span class=\"token punctuation\">,<\/span> 30<span class=\"token punctuation\">,<\/span> 46<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 16px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">box-shadow<\/span><span class=\"token punctuation\">:<\/span> 0 12px 40px <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>0<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">,<\/span> 0.6<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">overflow<\/span><span class=\"token punctuation\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">header<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 18px 30px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>25<span class=\"token punctuation\">,<\/span> 25<span class=\"token punctuation\">,<\/span> 40<span class=\"token punctuation\">,<\/span> 0.95<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-bottom<\/span><span class=\"token punctuation\">:<\/span> 1px solid #44475a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> space-between<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">z-index<\/span><span class=\"token punctuation\">:<\/span> 10<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.logo<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.logo-icon<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">height<\/span><span class=\"token punctuation\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #3498db<span class=\"token punctuation\">,<\/span> #9b59b6<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> bold<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">h1<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.8rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>90deg<span class=\"token punctuation\">,<\/span> #3498db<span class=\"token punctuation\">,<\/span> #9b59b6<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">-webkit-background-clip<\/span><span class=\"token punctuation\">:<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">-webkit-text-fill-color<\/span><span class=\"token punctuation\">:<\/span> transparent<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> 700<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.subtitle<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">margin-top<\/span><span class=\"token punctuation\">:<\/span> 4px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.controls<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">button<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 10px 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border<\/span><span class=\"token punctuation\">:<\/span> none<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>65<span class=\"token punctuation\">,<\/span> 105<span class=\"token punctuation\">,<\/span> 225<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> white<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> 600<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">cursor<\/span><span class=\"token punctuation\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">transition<\/span><span class=\"token punctuation\">:<\/span> all 0.3s ease<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">button:hover<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>65<span class=\"token punctuation\">,<\/span> 105<span class=\"token punctuation\">,<\/span> 225<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">transform<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">translateY<\/span><span class=\"token punctuation\">(<\/span>-2px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">button.secondary<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>52<span class=\"token punctuation\">,<\/span> 152<span class=\"token punctuation\">,<\/span> 219<span class=\"token punctuation\">,<\/span> 0.3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.main-content<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">overflow<\/span><span class=\"token punctuation\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.tool-panel<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 280px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>25<span class=\"token punctuation\">,<\/span> 25<span class=\"token punctuation\">,<\/span> 40<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-right<\/span><span class=\"token punctuation\">:<\/span> 1px solid #44475a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 25px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.panel-section<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>40<span class=\"token punctuation\">,<\/span> 42<span class=\"token punctuation\">,<\/span> 54<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 12px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 18px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">box-shadow<\/span><span class=\"token punctuation\">:<\/span> 0 4px 10px <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>0<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">,<\/span> 0.2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.panel-title<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.1rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">margin-bottom<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #8be9fd<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> 600<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-types<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">repeat<\/span><span class=\"token punctuation\">(<\/span>2<span class=\"token punctuation\">,<\/span> 1fr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-type<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">height<\/span><span class=\"token punctuation\">:<\/span> 100px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>50<span class=\"token punctuation\">,<\/span> 50<span class=\"token punctuation\">,<\/span> 70<span class=\"token punctuation\">,<\/span> 0.8<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">cursor<\/span><span class=\"token punctuation\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">transition<\/span><span class=\"token punctuation\">:<\/span> all 0.3s ease<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border<\/span><span class=\"token punctuation\">:<\/span> 2px solid transparent<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-type:hover<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>65<span class=\"token punctuation\">,<\/span> 105<span class=\"token punctuation\">,<\/span> 225<span class=\"token punctuation\">,<\/span> 0.3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-color<\/span><span class=\"token punctuation\">:<\/span> #4169e1<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">transform<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">translateY<\/span><span class=\"token punctuation\">(<\/span>-3px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-icon<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">height<\/span><span class=\"token punctuation\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">margin-bottom<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-icon.input<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #3498db<span class=\"token punctuation\">,<\/span> #2980b9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-icon.process<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #2ecc71<span class=\"token punctuation\">,<\/span> #27ae60<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-icon.output<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #e74c3c<span class=\"token punctuation\">,<\/span> #c0392b<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.node-icon.decision<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #f39c12<span class=\"token punctuation\">,<\/span> #d35400<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.canvas-container<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">flex<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">position<\/span><span class=\"token punctuation\">:<\/span> relative<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">overflow<\/span><span class=\"token punctuation\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token function\">linear-gradient<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>30<span class=\"token punctuation\">,<\/span> 30<span class=\"token punctuation\">,<\/span> 46<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>30<span class=\"token punctuation\">,<\/span> 30<span class=\"token punctuation\">,<\/span> 46<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token function\">repeating-linear-gradient<\/span><span class=\"token punctuation\">(<\/span>0deg<span class=\"token punctuation\">,<\/span> transparent<span class=\"token punctuation\">,<\/span> transparent 19px<span class=\"token punctuation\">,<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>55<span class=\"token punctuation\">,<\/span> 55<span class=\"token punctuation\">,<\/span> 85<span class=\"token punctuation\">,<\/span> 0.5<span class=\"token punctuation\">)<\/span> 20px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token function\">repeating-linear-gradient<\/span><span class=\"token punctuation\">(<\/span>90deg<span class=\"token punctuation\">,<\/span> transparent<span class=\"token punctuation\">,<\/span> transparent 19px<span class=\"token punctuation\">,<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>55<span class=\"token punctuation\">,<\/span> 55<span class=\"token punctuation\">,<\/span> 85<span class=\"token punctuation\">,<\/span> 0.5<span class=\"token punctuation\">)<\/span> 20px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">#flow-container<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 100%<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">height<\/span><span class=\"token punctuation\">:<\/span> 100%<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.property-panel<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 320px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>25<span class=\"token punctuation\">,<\/span> 25<span class=\"token punctuation\">,<\/span> 40<span class=\"token punctuation\">,<\/span> 0.9<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-left<\/span><span class=\"token punctuation\">:<\/span> 1px solid #44475a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.property-form<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.form-group<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">label<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.9rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">input, textarea, select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 10px 12px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border<\/span><span class=\"token punctuation\">:<\/span> 1px solid #44475a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>40<span class=\"token punctuation\">,<\/span> 42<span class=\"token punctuation\">,<\/span> 54<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #f8f8f2<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.95rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">textarea<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">min-height<\/span><span class=\"token punctuation\">:<\/span> 100px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">resize<\/span><span class=\"token punctuation\">:<\/span> vertical<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.performance-stats<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> space-between<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>40<span class=\"token punctuation\">,<\/span> 42<span class=\"token punctuation\">,<\/span> 54<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 12px 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.85rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.stat-item<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">flex-direction<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.stat-value<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> 700<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.1rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #50fa7b<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.stat-label<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.75rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.optimization-tips<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">margin-top<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>40<span class=\"token punctuation\">,<\/span> 42<span class=\"token punctuation\">,<\/span> 54<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.9rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.tip-title<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #ffb86c<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">margin-bottom<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-weight<\/span><span class=\"token punctuation\">:<\/span> 600<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.tip-list<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding-left<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.tip-list li<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">margin-bottom<\/span><span class=\"token punctuation\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">line-height<\/span><span class=\"token punctuation\">:<\/span> 1.4<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">footer<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 15px 30px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>25<span class=\"token punctuation\">,<\/span> 25<span class=\"token punctuation\">,<\/span> 40<span class=\"token punctuation\">,<\/span> 0.95<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-top<\/span><span class=\"token punctuation\">:<\/span> 1px solid #44475a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> space-between<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 0.9rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.view-controls<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.view-btn<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 8px 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>65<span class=\"token punctuation\">,<\/span> 105<span class=\"token punctuation\">,<\/span> 225<span class=\"token punctuation\">,<\/span> 0.2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">border-radius<\/span><span class=\"token punctuation\">:<\/span> 6px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token property\">cursor<\/span><span class=\"token punctuation\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token selector\">.view-btn.active<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>65<span class=\"token punctuation\">,<\/span> 105<span class=\"token punctuation\">,<\/span> 225<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>style<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>app<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>container<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>header<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>logo<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>logo-icon<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>K<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h1<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>Konva.js\u6d41\u7a0b\u56fe\u5f15\u64ce\u6df1\u5ea6\u4f18\u5316<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h1<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>subtitle<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u9ad8\u6027\u80fdCanvas\u6e32\u67d3\u4f53\u7cfb &#8211; \u8282\u70b9\u6570\u91cf: {{ nodes.length }} | \u8fde\u63a5\u7ebf: {{ connections.length }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>controls<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;input&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#043;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u6dfb\u52a0\u8f93\u5165\u8282\u70b9<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;process&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>secondary<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#043;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u6dfb\u52a0\u5904\u7406\u8282\u70b9<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>resetCanvas<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u21ba<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u91cd\u7f6e\u753b\u5e03<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>header<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>main-content<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>tool-panel<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>panel-section<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>panel-title<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#x1f4cb;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u8282\u70b9\u5e93<br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-types<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-type<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;input&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-icon input<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8f93\u5165\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-type<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;process&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-icon process<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u5904\u7406\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-type<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;output&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-icon output<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8f93\u51fa\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-type<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>addNode(&#039;decision&#039;)<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>node-icon decision<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u51b3\u7b56\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>panel-section<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>panel-title<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u2699\ufe0f<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u753b\u5e03\u63a7\u5236<br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u7f29\u653e\u7ea7\u522b: {{ (stageConfig.scale * 100).toFixed(0) }}%<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>range<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">min<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>10<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">max<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>300<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stageConfig.scale<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">step<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>5<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u80cc\u666f\u7f51\u683c: {{ showGrid ? &#039;\u5f00\u542f&#039; : &#039;\u5173\u95ed&#039; }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>checkbox<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>showGrid<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>optimization-tips<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>tip-title<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#x1f680; \u6027\u80fd\u4f18\u5316\u6280\u5de7<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>ul<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>tip-list<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u5206\u5c42\u6e32\u67d3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>: \u9759\u6001\u5143\u7d20\u4e0e\u52a8\u6001\u5143\u7d20\u5206\u79bb\u56fe\u5c42<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u6279\u91cf\u66f4\u65b0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>: \u4f7f\u7528Konva.FastLayer\u6279\u91cf\u7ed8\u5236\u64cd\u4f5c<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u865a\u62df\u5316\u6e32\u67d3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>: \u4ec5\u6e32\u67d3\u89c6\u53e3\u5185\u53ef\u89c1\u5143\u7d20<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u7f13\u5b58\u7b56\u7565<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>: \u5bf9\u590d\u6742\u8282\u70b9\u8c03\u7528node.cache()<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>GPU\u52a0\u901f<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>: \u542f\u7528willReadFrequently: false\u9009\u9879<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>li<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>ul<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>canvas-container<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>flow-container<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>property-panel<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-if<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>panel-title<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#x1f4dd;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u8282\u70b9\u5c5e\u6027<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>property-form<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8282\u70b9ID<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>text<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.id<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">disabled<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8282\u70b9\u7c7b\u578b<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>select<\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.type<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>input<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8f93\u5165\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>process<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u5904\u7406\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>output<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8f93\u51fa\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>decision<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u51b3\u7b56\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>select<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8282\u70b9\u6807\u9898<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>text<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.config.name<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u8282\u70b9\u63cf\u8ff0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>textarea<\/span> <span class=\"token attr-name\">v-model<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.config.description<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>textarea<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>form-group<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u4f4d\u7f6e (X: {{ selectedNode.config.x }}, Y: {{ selectedNode.config.y }})<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token special-attr\"><span class=\"token attr-name\">style<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span><span class=\"token value css language-css\"><span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span> <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><\/span><span class=\"token punctuation\">&#034;<\/span><\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>number<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model.number<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.config.x<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token special-attr\"><span class=\"token attr-name\">style<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span><span class=\"token value css language-css\"><span class=\"token property\">flex<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span><\/span><span class=\"token punctuation\">&#034;<\/span><\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>number<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">v-model.number<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>selectedNode.config.y<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token special-attr\"><span class=\"token attr-name\">style<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span><span class=\"token value css language-css\"><span class=\"token property\">flex<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span><\/span><span class=\"token punctuation\">&#034;<\/span><\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>performance-stats<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-item<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-value<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>{{ frameRate }} FPS<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-label<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u5e27\u7387<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-item<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-value<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>{{ renderTime }}ms<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-label<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u6e32\u67d3\u65f6\u95f4<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-item<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-value<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>{{ visibleNodes }}\/{{ nodes.length }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>stat-label<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\u53ef\u89c1\u8282\u70b9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>removeNode(selectedNode)<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token special-attr\"><span class=\"token attr-name\">style<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span><span class=\"token value css language-css\"><span class=\"token property\">margin-top<\/span><span class=\"token punctuation\">:<\/span> 20px<span class=\"token punctuation\">;<\/span> <span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span>231<span class=\"token punctuation\">,<\/span> 76<span class=\"token punctuation\">,<\/span> 60<span class=\"token punctuation\">,<\/span> 0.7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/span><span class=\"token punctuation\">&#034;<\/span><\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>&#x1f5d1;\ufe0f<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> \u5220\u9664\u8282\u70b9<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>footer<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>Konva.js v8.4.2 | Vue 3.3 | \u9ad8\u6027\u80fd\u6d41\u7a0b\u56fe\u5f15\u64ce<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>view-controls<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>view-btn<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">:class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>{active: viewMode &#061;&#061;&#061; &#039;default&#039;}<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>viewMode &#061; &#039;default&#039;<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        \u9ed8\u8ba4\u89c6\u56fe<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>view-btn<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">:class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>{active: viewMode &#061;&#061;&#061; &#039;minimal&#039;}<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>viewMode &#061; &#039;minimal&#039;<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        \u6027\u80fd\u6a21\u5f0f<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>view-btn<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">:class<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>{active: viewMode &#061;&#061;&#061; &#039;debug&#039;}<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\">&#064;click<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>viewMode &#061; &#039;debug&#039;<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                        \u8c03\u8bd5\u89c6\u56fe<br \/>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>footer<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token script\"><span class=\"token language-javascript\"><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> createApp<span class=\"token punctuation\">,<\/span> ref<span class=\"token punctuation\">,<\/span> reactive<span class=\"token punctuation\">,<\/span> computed<span class=\"token punctuation\">,<\/span> onMounted <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">&#061;<\/span> Vue<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token function\">createApp<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">setup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u8282\u70b9\u6570\u636e<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> nodes <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">reactive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node1&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;input&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">config<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">160<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#3498db&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6570\u636e\u8f93\u5165&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">description<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u539f\u59cb\u6570\u636e\u8f93\u5165\u8282\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">cornerRadius<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node2&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;process&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">config<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">450<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">160<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#2ecc71&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6570\u636e\u5904\u7406&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">description<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6570\u636e\u6e05\u6d17\u4e0e\u8f6c\u6362&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">cornerRadius<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node3&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;decision&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">config<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">700<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">160<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#f39c12&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u51b3\u7b56\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">description<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6839\u636e\u6761\u4ef6\u8fdb\u884c\u5206\u652f\u51b3\u7b56&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">cornerRadius<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node4&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;output&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">config<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">950<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">160<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#e74c3c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u7ed3\u679c\u8f93\u51fa&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">description<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u8f93\u51fa\u5904\u7406\u540e\u7684\u7ed3\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">cornerRadius<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8fde\u63a5\u7ebf\u6570\u636e<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> connections <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">reactive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;conn1&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node1&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node2&#039;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;conn2&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node2&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node3&#039;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;conn3&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node3&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node4&#039;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u821e\u53f0\u914d\u7f6e<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> stageConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">reactive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> window<span class=\"token punctuation\">.<\/span>innerWidth<span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> window<span class=\"token punctuation\">.<\/span>innerHeight <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">180<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">scale<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u9009\u4e2d\u7684\u8282\u70b9<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> selectedNode <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u89c6\u56fe\u6a21\u5f0f<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> viewMode <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;default&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u662f\u5426\u663e\u793a\u7f51\u683c<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> showGrid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6027\u80fd\u6307\u6807<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> frameRate <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> renderTime <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> visibleNodes <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6dfb\u52a0\u65b0\u8282\u70b9<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">addNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">type<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> colors <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">input<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#3498db&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">process<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#2ecc71&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">output<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#e74c3c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">decision<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#f39c12&#039;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> names <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">input<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u8f93\u5165\u8282\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">process<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u5904\u7406\u8282\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">output<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u8f93\u51fa\u8282\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">decision<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u51b3\u7b56\u8282\u70b9&#039;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> newNode <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;node&#039;<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> type<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">config<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">160<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> colors<span class=\"token punctuation\">[<\/span>type<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> names<span class=\"token punctuation\">[<\/span>type<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">description<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u65b0\u6dfb\u52a0\u7684\u8282\u70b9&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">cornerRadius<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>newNode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    selectedNode<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> newNode<span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u968f\u673a\u6dfb\u52a0\u8fde\u63a5\u7ebf<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&amp;&amp;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> fromNode <span class=\"token operator\">&#061;<\/span> nodes<span class=\"token punctuation\">[<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">floor<\/span><span class=\"token punctuation\">(<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        connections<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">conn<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>connections<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> fromNode<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> newNode<span class=\"token punctuation\">.<\/span>id<br \/>\n                        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u79fb\u9664\u8282\u70b9<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">removeNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">node<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> index <span class=\"token operator\">&#061;<\/span> nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">findIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">n<\/span> <span class=\"token operator\">&#061;&gt;<\/span> n<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;&#061;&#061;<\/span> node<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>index <span class=\"token operator\">!&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">splice<\/span><span class=\"token punctuation\">(<\/span>index<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u79fb\u9664\u76f8\u5173\u8fde\u63a5\u7ebf<\/span><br \/>\n                        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">&#061;<\/span> connections<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>connections<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>from <span class=\"token operator\">&#061;&#061;&#061;<\/span> node<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">||<\/span> connections<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>to <span class=\"token operator\">&#061;&#061;&#061;<\/span> node<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                                connections<span class=\"token punctuation\">.<\/span><span class=\"token function\">splice<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>selectedNode<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&amp;&amp;<\/span> selectedNode<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;&#061;&#061;<\/span> node<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            selectedNode<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u91cd\u7f6e\u753b\u5e03<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">resetCanvas<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">splice<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> nodes<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    connections<span class=\"token punctuation\">.<\/span><span class=\"token function\">splice<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> connections<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    selectedNode<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u521d\u59cb\u8282\u70b9<\/span><br \/>\n                    <span class=\"token function\">addNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;input&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">addNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;process&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">addNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;output&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u8fde\u63a5\u7ebf<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        connections<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><br \/>\n                            <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;conn1&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> nodes<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> nodes<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>id <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                            <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;conn2&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> nodes<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">to<\/span><span class=\"token operator\">:<\/span> nodes<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>id <span class=\"token punctuation\">}<\/span><br \/>\n                        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8ba1\u7b97\u8fde\u63a5\u7ebf\u914d\u7f6e<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">calcLineConfig<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">conn<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> fromNode <span class=\"token operator\">&#061;<\/span> nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">n<\/span> <span class=\"token operator\">&#061;&gt;<\/span> n<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;&#061;&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>from<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> toNode <span class=\"token operator\">&#061;<\/span> nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">n<\/span> <span class=\"token operator\">&#061;&gt;<\/span> n<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;&#061;&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>to<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>fromNode <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>toNode<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> fromX <span class=\"token operator\">&#061;<\/span> fromNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#043;<\/span> fromNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> fromY <span class=\"token operator\">&#061;<\/span> fromNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;<\/span> fromNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">\/<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> toX <span class=\"token operator\">&#061;<\/span> toNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> toY <span class=\"token operator\">&#061;<\/span> toNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;<\/span> toNode<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">\/<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u8ba1\u7b97\u4e2d\u95f4\u63a7\u5236\u70b9&#xff08;\u8d1d\u585e\u5c14\u66f2\u7ebf&#xff09;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> midX <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>fromX <span class=\"token operator\">&#043;<\/span> toX<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">points<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>fromX<span class=\"token punctuation\">,<\/span> fromY<span class=\"token punctuation\">,<\/span> midX<span class=\"token punctuation\">,<\/span> fromY<span class=\"token punctuation\">,<\/span> midX<span class=\"token punctuation\">,<\/span> toY<span class=\"token punctuation\">,<\/span> toX<span class=\"token punctuation\">,<\/span> toY<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">stroke<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;#3498db&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">strokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">lineCap<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;round&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">lineJoin<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;round&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">bezier<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">dash<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.8<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5904\u7406\u8282\u70b9\u79fb\u52a8<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">handleNodeMove<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> nodeId <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span><span class=\"token function\">id<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> node <span class=\"token operator\">&#061;<\/span> nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">n<\/span> <span class=\"token operator\">&#061;&gt;<\/span> n<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;&#061;&#061;<\/span> nodeId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span><span class=\"token function\">x<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span><span class=\"token function\">y<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u9009\u62e9\u8282\u70b9<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">selectNode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">node<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    selectedNode<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> node<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5904\u7406\u7f29\u653e<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">handleZoom<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    e<span class=\"token punctuation\">.<\/span>evt<span class=\"token punctuation\">.<\/span><span class=\"token function\">preventDefault<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> scaleBy <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> stage <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span><span class=\"token function\">getStage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> oldScale <span class=\"token operator\">&#061;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">scaleX<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> pointer <span class=\"token operator\">&#061;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPointerPosition<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>pointer<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> newScale <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>evt<span class=\"token punctuation\">.<\/span>deltaY <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">?<\/span><br \/>\n                        oldScale <span class=\"token operator\">*<\/span> scaleBy <span class=\"token operator\">:<\/span><br \/>\n                        oldScale <span class=\"token operator\">\/<\/span> scaleBy<span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u9650\u5236\u7f29\u653e\u8303\u56f4<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> clampedScale <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.1<\/span><span class=\"token punctuation\">,<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> newScale<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">scale<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> clampedScale<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> clampedScale <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stageConfig<span class=\"token punctuation\">.<\/span>scale <span class=\"token operator\">&#061;<\/span> clampedScale<span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u8ba1\u7b97\u504f\u79fb\u4fdd\u6301\u4e2d\u5fc3\u70b9\u7a33\u5b9a<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> mousePointTo <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span>pointer<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#8211;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">x<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> oldScale<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span>pointer<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#8211;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">y<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> oldScale<br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">position<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> pointer<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#8211;<\/span> mousePointTo<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">*<\/span> clampedScale<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> pointer<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#8211;<\/span> mousePointTo<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">*<\/span> clampedScale<br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">batchDraw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u521d\u59cb\u5316Konva<\/span><br \/>\n                <span class=\"token function\">onMounted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> stage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Stage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">container<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;flow-container&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> stageConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> stageConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">draggable<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">willReadFrequently<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span> <span class=\"token comment\">\/\/ \u542f\u7528GPU\u52a0\u901f<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u56fe\u5c42<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> backgroundLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Layer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> gridLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Layer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> connectionLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>FastLayer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f7f\u7528FastLayer\u4f18\u5316<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> nodeLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>FastLayer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f7f\u7528FastLayer\u4f18\u5316<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> toolLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Layer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>backgroundLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>gridLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>connectionLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>nodeLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>toolLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u7ed8\u5236\u80cc\u666f<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> background <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Rect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> stageConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> stageConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;rgba(30, 30, 46, 1)&#039;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    backgroundLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>background<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    backgroundLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u7ed8\u5236\u7f51\u683c<\/span><br \/>\n                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">drawGrid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gridLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">destroyChildren<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>showGrid<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            gridLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        <span class=\"token keyword\">const<\/span> gridSize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> gridColor <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;rgba(65, 105, 225, 0.15)&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u6c34\u5e73\u7ebf<\/span><br \/>\n                        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">height<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> gridSize<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> line <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Line<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">points<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> i <span class=\"token operator\">*<\/span> gridSize<span class=\"token punctuation\">,<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">width<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> i <span class=\"token operator\">*<\/span> gridSize<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">stroke<\/span><span class=\"token operator\">:<\/span> gridColor<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">strokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">listening<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            gridLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u5782\u76f4\u7ebf<\/span><br \/>\n                        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">width<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> gridSize<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> line <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Line<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">points<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>i <span class=\"token operator\">*<\/span> gridSize<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> i <span class=\"token operator\">*<\/span> gridSize<span class=\"token punctuation\">,<\/span> stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">height<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">stroke<\/span><span class=\"token operator\">:<\/span> gridColor<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">strokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">listening<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            gridLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        gridLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521d\u59cb\u7ed8\u5236\u7f51\u683c<\/span><br \/>\n                    <span class=\"token function\">drawGrid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6e32\u67d3\u8282\u70b9<\/span><br \/>\n                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">renderNodes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        nodeLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">destroyChildren<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        nodes<span class=\"token punctuation\">.<\/span><span class=\"token function\">forEach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">node<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> rect <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Rect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token operator\">&#8230;<\/span>node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">shadowColor<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;rgba(0,0,0,0.3)&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">shadowBlur<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">shadowOffset<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">shadowOpacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.5<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6dfb\u52a0\u6587\u672c<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> text <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Text<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">text<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fontSize<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">18<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;white&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fontFamily<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;Arial, sans-serif&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fontStyle<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;bold&#039;<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6dfb\u52a0\u63cf\u8ff0\u6587\u672c<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> desc <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Text<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">45<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">text<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>description<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fontSize<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">14<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;rgba(255, 255, 255, 0.7)&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> node<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">20<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u7f13\u5b58\u8282\u70b9\u4ee5\u63d0\u9ad8\u6027\u80fd<\/span><br \/>\n                            rect<span class=\"token punctuation\">.<\/span><span class=\"token function\">cache<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            text<span class=\"token punctuation\">.<\/span><span class=\"token function\">cache<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            desc<span class=\"token punctuation\">.<\/span><span class=\"token function\">cache<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            nodeLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>rect<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            nodeLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            nodeLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>desc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6dfb\u52a0\u4e8b\u4ef6\u76d1\u542c<\/span><br \/>\n                            rect<span class=\"token punctuation\">.<\/span><span class=\"token function\">on<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;click&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token function\">selectNode<\/span><span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            rect<span class=\"token punctuation\">.<\/span><span class=\"token function\">on<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;dragmove&#039;<\/span><span class=\"token punctuation\">,<\/span> handleNodeMove<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        nodeLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6e32\u67d3\u8fde\u63a5\u7ebf<\/span><br \/>\n                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">renderConnections<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        connectionLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">destroyChildren<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        connections<span class=\"token punctuation\">.<\/span><span class=\"token function\">forEach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">conn<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> config <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">calcLineConfig<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>config<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token keyword\">const<\/span> line <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Line<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> conn<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token operator\">&#8230;<\/span>config<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">strokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">lineCap<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;round&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">lineJoin<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;round&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">hitStrokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">15<\/span> <span class=\"token comment\">\/\/ \u589e\u52a0\u547d\u4e2d\u533a\u57df<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6dfb\u52a0\u7bad\u5934<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> arrow <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Konva<span class=\"token punctuation\">.<\/span>Arrow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                                <span class=\"token literal-property property\">points<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">[<\/span>config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                        config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">[<\/span>config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                        config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">[<\/span>config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                        config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">[<\/span>config<span class=\"token punctuation\">.<\/span>points<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">pointerLength<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">pointerWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">fill<\/span><span class=\"token operator\">:<\/span> config<span class=\"token punctuation\">.<\/span>stroke<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">stroke<\/span><span class=\"token operator\">:<\/span> config<span class=\"token punctuation\">.<\/span>stroke<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token literal-property property\">strokeWidth<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span><br \/>\n                            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                            connectionLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            connectionLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>arrow<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        connectionLayer<span class=\"token punctuation\">.<\/span><span class=\"token function\">draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521d\u59cb\u6e32\u67d3<\/span><br \/>\n                    <span class=\"token function\">renderNodes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">renderConnections<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u5904\u7406\u7f29\u653e<\/span><br \/>\n                    stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">on<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;wheel&#039;<\/span><span class=\"token punctuation\">,<\/span> handleZoom<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u54cd\u5e94\u5f0f\u8c03\u6574\u821e\u53f0\u5927\u5c0f<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">addEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;resize&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        stageConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> window<span class=\"token punctuation\">.<\/span>innerWidth<span class=\"token punctuation\">;<\/span><br \/>\n                        stageConfig<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> window<span class=\"token punctuation\">.<\/span>innerHeight <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">180<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">width<\/span><span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        stage<span class=\"token punctuation\">.<\/span><span class=\"token function\">height<\/span><span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        background<span class=\"token punctuation\">.<\/span><span class=\"token function\">width<\/span><span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        background<span class=\"token punctuation\">.<\/span><span class=\"token function\">height<\/span><span class=\"token punctuation\">(<\/span>stageConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token function\">drawGrid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token function\">renderNodes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token function\">renderConnections<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6027\u80fd\u76d1\u63a7<\/span><br \/>\n                    <span class=\"token keyword\">let<\/span> lastTime <span class=\"token operator\">&#061;<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">let<\/span> frameCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">monitorPerformance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> now <span class=\"token operator\">&#061;<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> delta <span class=\"token operator\">&#061;<\/span> now <span class=\"token operator\">&#8211;<\/span> lastTime<span class=\"token punctuation\">;<\/span><br \/>\n                        frameCount<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>delta <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            frameRate<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">round<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>frameCount <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> delta<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            frameCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            lastTime <span class=\"token operator\">&#061;<\/span> now<span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6a21\u62df\u6e32\u67d3\u65f6\u95f4&#xff08;\u5b9e\u9645\u5e94\u7528\u4e2d\u5e94\u4f7f\u7528\u5b9e\u9645\u6d4b\u91cf\u503c&#xff09;<\/span><br \/>\n                            renderTime<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span> <span class=\"token operator\">&#8211;<\/span> nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">\/<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            visibleNodes<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">,<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">floor<\/span><span class=\"token punctuation\">(<\/span>nodes<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">*<\/span> <span class=\"token number\">0.8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        <span class=\"token function\">requestAnimationFrame<\/span><span class=\"token punctuation\">(<\/span>monitorPerformance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token function\">monitorPerformance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    nodes<span class=\"token punctuation\">,<\/span><br \/>\n                    connections<span class=\"token punctuation\">,<\/span><br \/>\n                    stageConfig<span class=\"token punctuation\">,<\/span><br \/>\n                    selectedNode<span class=\"token punctuation\">,<\/span><br \/>\n                    viewMode<span class=\"token punctuation\">,<\/span><br \/>\n                    showGrid<span class=\"token punctuation\">,<\/span><br \/>\n                    frameRate<span class=\"token punctuation\">,<\/span><br \/>\n                    renderTime<span class=\"token punctuation\">,<\/span><br \/>\n                    visibleNodes<span class=\"token punctuation\">,<\/span><br \/>\n                    addNode<span class=\"token punctuation\">,<\/span><br \/>\n                    removeNode<span class=\"token punctuation\">,<\/span><br \/>\n                    resetCanvas<span class=\"token punctuation\">,<\/span><br \/>\n                    calcLineConfig<span class=\"token punctuation\">,<\/span><br \/>\n                    handleNodeMove<span class=\"token punctuation\">,<\/span><br \/>\n                    selectNode<span class=\"token punctuation\">,<\/span><br \/>\n                    handleZoom<br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;#app&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<h3>02\u3001\u5173\u952e\u6027\u80fd\u4f18\u5316\u5b9e\u73b0<\/h3>\n<li>\n<p>\u5206\u5c42\u6e32\u67d3&#xff1a;<\/p>\n<ul>\n<li>\u4f7f\u7528\u591a\u4e2a\u56fe\u5c42&#xff1a;\u80cc\u666f\u5c42\u3001\u7f51\u683c\u5c42\u3001\u8fde\u63a5\u7ebf\u5c42\u3001\u8282\u70b9\u5c42\u548c\u5de5\u5177\u5c42<\/li>\n<li>\u9759\u6001\u5143\u7d20&#xff08;\u80cc\u666f\u3001\u7f51\u683c&#xff09;\u4e0e\u52a8\u6001\u5143\u7d20&#xff08;\u8282\u70b9\u3001\u8fde\u63a5\u7ebf&#xff09;\u5206\u79bb<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u6279\u91cf\u66f4\u65b0&#xff1a;<\/p>\n<ul>\n<li>\u4f7f\u7528Konva.FastLayer\u5b9e\u73b0\u6279\u91cf\u7ed8\u5236\u64cd\u4f5c<\/li>\n<li>\u8282\u70b9\u548c\u8fde\u63a5\u7ebf\u4f7f\u7528\u4e13\u7528\u56fe\u5c42\u63d0\u9ad8\u6e32\u67d3\u6548\u7387<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u865a\u62df\u5316\u6e32\u67d3&#xff1a;<\/p>\n<ul>\n<li>\u8ba1\u7b97\u89c6\u53e3\u5185\u53ef\u89c1\u5143\u7d20&#xff08;\u6a21\u62df\u5b9e\u73b0&#xff09;<\/li>\n<li>\u6027\u80fd\u9762\u677f\u663e\u793a\u53ef\u89c1\u8282\u70b9\u6570\u91cf<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u7f13\u5b58\u7b56\u7565&#xff1a;<\/p>\n<ul>\n<li>\u5bf9\u590d\u6742\u8282\u70b9\u8c03\u7528node.cache()\u65b9\u6cd5\u7f13\u5b58\u4f4d\u56fe<\/li>\n<li>\u6587\u672c\u5143\u7d20\u4e5f\u8fdb\u884c\u7f13\u5b58\u4f18\u5316<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>GPU\u52a0\u901f&#xff1a;<\/p>\n<ul>\n<li>\u5728Stage\u914d\u7f6e\u4e2d\u8bbe\u7f6ewillReadFrequently: false\u542f\u7528GPU\u52a0\u901f<\/li>\n<li>\u4f7f\u7528\u786c\u4ef6\u52a0\u901f\u63d0\u9ad8\u6e32\u67d3\u6027\u80fd<\/li>\n<\/ul>\n<\/li>\n<h4>\u529f\u80fd\u4eae\u70b9<\/h4>\n<ul>\n<li>\u5b8c\u6574\u7684\u6d41\u7a0b\u56fe\u7f16\u8f91\u529f\u80fd&#xff08;\u6dfb\u52a0\/\u5220\u9664\u8282\u70b9\u3001\u8fde\u63a5\u7ebf&#xff09;<\/li>\n<li>\u8282\u70b9\u5c5e\u6027\u7f16\u8f91\u9762\u677f<\/li>\n<li>\u591a\u79cd\u89c6\u56fe\u6a21\u5f0f&#xff08;\u9ed8\u8ba4\u3001\u6027\u80fd\u3001\u8c03\u8bd5&#xff09;<\/li>\n<li>\u5b9e\u65f6\u6027\u80fd\u76d1\u63a7\u9762\u677f&#xff08;\u5e27\u7387\u3001\u6e32\u67d3\u65f6\u95f4&#xff09;<\/li>\n<li>\u54cd\u5e94\u5f0f\u5e03\u5c40\u9002\u5e94\u4e0d\u540c\u5c4f\u5e55\u5c3a\u5bf8<\/li>\n<li>\u73b0\u4ee3\u5316\u7684\u6df1\u8272UI\u8bbe\u8ba1<\/li>\n<\/ul>\n<h2>\u4e8c\u3001 WebGL\u4e09\u7ef4\u53ef\u89c6\u5316\u96c6\u6210<\/h2>\n<h3>vue-threejs\u6700\u4f73\u5b9e\u8df5<\/h3>\n<p>&lt;template&gt;<br \/>\n  &lt;TresCanvas<br \/>\n    shadows<br \/>\n    alpha<br \/>\n    :physar-enabled&#061;&#034;true&#034;<br \/>\n    &#064;created&#061;&#034;onSceneCreated&#034;<br \/>\n  &gt;<br \/>\n    &lt;TresPerspectiveCamera :position&#061;&#034;[5, 5, 5]&#034; \/&gt;<\/p>\n<p>    &lt;!&#8211; \u8f68\u9053\u63a7\u5236\u5668 &#8211;&gt;<br \/>\n    &lt;OrbitControls \/&gt;<\/p>\n<p>    &lt;!&#8211; \u52a8\u6001\u573a\u666f &#8211;&gt;<br \/>\n    &lt;Suspense&gt;<br \/>\n      &lt;VideoEditorScene :video-texture&#061;&#034;videoTexture&#034; \/&gt;<br \/>\n    &lt;\/Suspense&gt;<\/p>\n<p>    &lt;!&#8211; \u7279\u6548\u7cfb\u7edf &#8211;&gt;<br \/>\n    &lt;EffectComposer&gt;<br \/>\n      &lt;Bloom mipmapBlur luminanceThreshold&#061;{0.5} \/&gt;<br \/>\n      &lt;DepthOfField focusDistance&#061;{0.01} focalLength&#061;{0.02} bokehScale&#061;{2} \/&gt;<br \/>\n    &lt;\/EffectComposer&gt;<br \/>\n  &lt;\/TresCanvas&gt;<br \/>\n&lt;\/template&gt;<\/p>\n<p>&lt;script setup&gt;<br \/>\nimport { reactive, shallowRef } from &#039;vue&#039;;<br \/>\nimport { TresCanvas, useTexture } from &#039;&#064;tresjs\/core&#039;;<br \/>\nimport { OrbitControls, EffectComposer, Bloom, DepthOfField } from &#039;&#064;tresjs\/cientos&#039;;<\/p>\n<p>\/\/ \u54cd\u5e94\u5f0f\u89c6\u9891\u7eb9\u7406<br \/>\nconst videoSrc &#061; ref(&#039;\/assets\/video-sample.mp4&#039;);<br \/>\nconst { texture: videoTexture } &#061; useTexture({<br \/>\n  src: videoSrc,<br \/>\n  encoding: THREE.sRGBEncoding,<br \/>\n  minFilter: THREE.LinearFilter<br \/>\n});<\/p>\n<p>\/\/ \u573a\u666f\u521d\u59cb\u5316<br \/>\nconst sceneState &#061; reactive({<br \/>\n  timelinePosition: 0,<br \/>\n  activeEffects: [&#039;bloom&#039;, &#039;dof&#039;]<br \/>\n});<\/p>\n<p>function onSceneCreated({ scene, renderer }) {<br \/>\n  \/\/ \u6dfb\u52a0\u73af\u5883\u5149<br \/>\n  scene.add(new THREE.AmbientLight(0xffffff, 0.5));<\/p>\n<p>  \/\/ \u54cd\u5e94\u5f0f\u66f4\u65b0<br \/>\n  watch(() &#061;&gt; sceneState.timelinePosition, (pos) &#061;&gt; {<br \/>\n    scene.traverse(obj &#061;&gt; {<br \/>\n      if (obj.isTimelineObject) obj.updatePosition(pos);<br \/>\n    });<br \/>\n  });<br \/>\n}<\/p>\n<p>\/\/ \u89c6\u9891\u5904\u7406\u51fd\u6570<br \/>\nasync function applyEffect(effect) {<br \/>\n  const composer &#061; await import(&#039;&#064;tresjs\/post-processing&#039;);<br \/>\n  sceneState.activeEffects.push(effect);<br \/>\n}<br \/>\n&lt;\/script&gt;<\/p>\n<p>\u4e09\u7ef4\u7f16\u8f91\u573a\u666f\u7ec4\u4ef6&#xff1a;<\/p>\n<p>&lt;!&#8211; VideoEditorScene.vue &#8211;&gt;<br \/>\n&lt;template&gt;<br \/>\n  &lt;!&#8211; \u89c6\u9891\u5e73\u9762 &#8211;&gt;<br \/>\n  &lt;TresMesh :scale&#061;&#034;[16, 9, 1]&#034; :position&#061;&#034;[0, 0, 0]&#034;&gt;<br \/>\n    &lt;TresPlaneGeometry \/&gt;<br \/>\n    &lt;TresMeshStandardMaterial :map&#061;&#034;videoTexture&#034; side&#061;{THREE.DoubleSide} \/&gt;<br \/>\n  &lt;\/TresMesh&gt;<\/p>\n<p>  &lt;!&#8211; \u65f6\u95f4\u8f74 &#8211;&gt;<br \/>\n  &lt;TimelineRuler :position&#061;&#034;[0, -5, 0]&#034; \/&gt;<\/p>\n<p>  &lt;!&#8211; \u7279\u6548\u63a7\u5236\u70b9 &#8211;&gt;<br \/>\n  &lt;EffectControl<br \/>\n    v-for&#061;&#034;effect in activeEffects&#034;<br \/>\n    :key&#061;&#034;effect.id&#034;<br \/>\n    :effect&#061;&#034;effect&#034;<br \/>\n  \/&gt;<br \/>\n&lt;\/template&gt;<\/p>\n<p>WebGL\u4f18\u5316\u7b56\u7565&#xff1a;<\/p>\n<li>\u5b9e\u4f8b\u5316\u6e32\u67d3&#xff1a;\u5bf9\u91cd\u590d\u5143\u7d20\u4f7f\u7528InstancedMesh<\/li>\n<li>LOD\u7cfb\u7edf&#xff1a;\u6839\u636e\u8ddd\u79bb\u5207\u6362\u6a21\u578b\u7ec6\u8282\u7ea7\u522b<\/li>\n<li>GPU\u7c92\u5b50\u7cfb\u7edf&#xff1a;\u5904\u7406\u5927\u91cf\u52a8\u6001\u7c92\u5b50<\/li>\n<li>\u540e\u5904\u7406\u94fe\u4f18\u5316&#xff1a;\u5408\u5e76\u76f8\u4f3c\u6548\u679c\u901a\u9053<\/li>\n<li>\u5f02\u6b65\u52a0\u8f7d&#xff1a;\u4f7f\u7528Suspense\u7ba1\u7406\u8d44\u6e90\u52a0\u8f7d<\/li>\n<p>\u4e0b\u65b9\u4e3a\u5b8c\u6574WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668<\/p>\n<p><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">!<\/span><span class=\"token constant\">DOCTYPE<\/span> html<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span>html lang<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;zh-CN&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span>head<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>meta charset<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;UTF-8&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>meta name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;viewport&#034;<\/span> content<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;width&#061;device-width, initial-scale&#061;1.0&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>title<span class=\"token operator\">&gt;<\/span>WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668 <span class=\"token operator\">|<\/span> Vue<span class=\"token operator\">&#8211;<\/span>Three<span class=\"token punctuation\">.<\/span>js\u96c6\u6210<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>title<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/vue&#064;3\/dist\/vue.global.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/build\/three.min.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/controls\/OrbitControls.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/postprocessing\/EffectComposer.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/postprocessing\/RenderPass.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/postprocessing\/ShaderPass.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/postprocessing\/BloomPass.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/shaders\/CopyShader.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>script src<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;https:\/\/cdn.jsdelivr.net\/npm\/three&#064;0.154.0\/examples\/js\/shaders\/LuminosityHighPassShader.js&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>style<span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">margin<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            box<span class=\"token operator\">&#8211;<\/span>sizing<span class=\"token operator\">:<\/span> border<span class=\"token operator\">&#8211;<\/span>box<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>family<span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;Segoe UI&#039;<\/span><span class=\"token punctuation\">,<\/span> Tahoma<span class=\"token punctuation\">,<\/span> Geneva<span class=\"token punctuation\">,<\/span> Verdana<span class=\"token punctuation\">,<\/span> sans<span class=\"token operator\">&#8211;<\/span>serif<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        body <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> linear<span class=\"token operator\">&#8211;<\/span><span class=\"token function\">gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #0f2027<span class=\"token punctuation\">,<\/span> #203a43<span class=\"token punctuation\">,<\/span> #2c5364<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #ecf0f1<span class=\"token punctuation\">;<\/span><br \/>\n            min<span class=\"token operator\">&#8211;<\/span>height<span class=\"token operator\">:<\/span> 100vh<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">overflow<\/span><span class=\"token operator\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>container <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            max<span class=\"token operator\">&#8211;<\/span>width<span class=\"token operator\">:<\/span> 1800px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">margin<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> auto<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">calc<\/span><span class=\"token punctuation\">(<\/span>100vh <span class=\"token operator\">&#8211;<\/span> 40px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">22<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">33<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.85<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 16px<span class=\"token punctuation\">;<\/span><br \/>\n            box<span class=\"token operator\">&#8211;<\/span>shadow<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> 12px 40px <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.6<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">overflow<\/span><span class=\"token operator\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        header <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 18px 30px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.95<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>bottom<span class=\"token operator\">:<\/span> 1px solid #2a3a4a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> space<span class=\"token operator\">&#8211;<\/span>between<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            z<span class=\"token operator\">&#8211;<\/span>index<span class=\"token operator\">:<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>logo <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>logo<span class=\"token operator\">&#8211;<\/span>icon <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> linear<span class=\"token operator\">&#8211;<\/span><span class=\"token function\">gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #00c9ff<span class=\"token punctuation\">,<\/span> #92fe9d<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> bold<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        h1 <span class=\"token punctuation\">{<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">.<\/span>8rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> linear<span class=\"token operator\">&#8211;<\/span><span class=\"token function\">gradient<\/span><span class=\"token punctuation\">(<\/span>90deg<span class=\"token punctuation\">,<\/span> #00c9ff<span class=\"token punctuation\">,<\/span> #92fe9d<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">&#8211;<\/span>webkit<span class=\"token operator\">&#8211;<\/span>background<span class=\"token operator\">&#8211;<\/span>clip<span class=\"token operator\">:<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">&#8211;<\/span>webkit<span class=\"token operator\">&#8211;<\/span>text<span class=\"token operator\">&#8211;<\/span>fill<span class=\"token operator\">&#8211;<\/span>color<span class=\"token operator\">:<\/span> transparent<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> <span class=\"token number\">700<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>subtitle <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> 1rem<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 4px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>main<span class=\"token operator\">&#8211;<\/span>content <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">flex<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">overflow<\/span><span class=\"token operator\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>tool<span class=\"token operator\">&#8211;<\/span>panel <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 280px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>right<span class=\"token operator\">:<\/span> 1px solid #2a3a4a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 25px<span class=\"token punctuation\">;<\/span><br \/>\n            overflow<span class=\"token operator\">&#8211;<\/span>y<span class=\"token operator\">:<\/span> auto<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>panel<span class=\"token operator\">&#8211;<\/span>section <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">48<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 12px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 18px<span class=\"token punctuation\">;<\/span><br \/>\n            box<span class=\"token operator\">&#8211;<\/span>shadow<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> 4px 15px <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>panel<span class=\"token operator\">&#8211;<\/span>title <span class=\"token punctuation\">{<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">.<\/span>1rem<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>bottom<span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #00c9ff<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> <span class=\"token number\">600<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>effect<span class=\"token operator\">&#8211;<\/span>types <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> grid<span class=\"token punctuation\">;<\/span><br \/>\n            grid<span class=\"token operator\">&#8211;<\/span>template<span class=\"token operator\">&#8211;<\/span>columns<span class=\"token operator\">:<\/span> <span class=\"token function\">repeat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> 1fr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>effect<span class=\"token operator\">&#8211;<\/span>type <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> 100px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">25<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">35<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">55<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">cursor<\/span><span class=\"token operator\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transition<\/span><span class=\"token operator\">:<\/span> all <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>3s ease<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">border<\/span><span class=\"token operator\">:<\/span> 2px solid transparent<span class=\"token punctuation\">;<\/span><br \/>\n            text<span class=\"token operator\">&#8211;<\/span>align<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>effect<span class=\"token operator\">&#8211;<\/span>type<span class=\"token operator\">:<\/span>hover <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>color<span class=\"token operator\">:<\/span> #00c9ff<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transform<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">translateY<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>3px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>effect<span class=\"token operator\">&#8211;<\/span>icon <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>bottom<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>canvas<span class=\"token operator\">&#8211;<\/span>container <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">flex<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">position<\/span><span class=\"token operator\">:<\/span> relative<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">overflow<\/span><span class=\"token operator\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        #three<span class=\"token operator\">&#8211;<\/span>canvas <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">100<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">100<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> block<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>canvas<span class=\"token operator\">&#8211;<\/span>overlay <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">position<\/span><span class=\"token operator\">:<\/span> absolute<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">bottom<\/span><span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">left<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">right<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>timeline <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 15px 20px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">80<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            backdrop<span class=\"token operator\">&#8211;<\/span>filter<span class=\"token operator\">:<\/span> <span class=\"token function\">blur<\/span><span class=\"token punctuation\">(<\/span>10px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">border<\/span><span class=\"token operator\">:<\/span> 1px solid <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>timeline<span class=\"token operator\">&#8211;<\/span>track <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> 60px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">45<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">70<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.6<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">position<\/span><span class=\"token operator\">:<\/span> relative<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">overflow<\/span><span class=\"token operator\">:<\/span> hidden<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>timeline<span class=\"token operator\">&#8211;<\/span>indicator <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">position<\/span><span class=\"token operator\">:<\/span> absolute<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">top<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">bottom<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 3px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> #00c9ff<span class=\"token punctuation\">;<\/span><br \/>\n            box<span class=\"token operator\">&#8211;<\/span>shadow<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> <span class=\"token number\">0<\/span> 10px #00c9ff<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transform<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">translateX<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">left<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">30<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>property<span class=\"token operator\">&#8211;<\/span>panel <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 320px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>left<span class=\"token operator\">:<\/span> 1px solid #2a3a4a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n            overflow<span class=\"token operator\">&#8211;<\/span>y<span class=\"token operator\">:<\/span> auto<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>property<span class=\"token operator\">&#8211;<\/span>form <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>form<span class=\"token operator\">&#8211;<\/span>group <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        label <span class=\"token punctuation\">{<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>9rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        input<span class=\"token punctuation\">,<\/span> select <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 10px 12px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">border<\/span><span class=\"token operator\">:<\/span> 1px solid #2a3a4a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">48<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #f8f8f2<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>95rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>slider<span class=\"token operator\">&#8211;<\/span>container <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        input<span class=\"token punctuation\">[<\/span>type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">flex<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>value<span class=\"token operator\">&#8211;<\/span>display <span class=\"token punctuation\">{<\/span><br \/>\n            min<span class=\"token operator\">&#8211;<\/span>width<span class=\"token operator\">:<\/span> 40px<span class=\"token punctuation\">;<\/span><br \/>\n            text<span class=\"token operator\">&#8211;<\/span>align<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 5px 10px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 6px<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>9rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>performance<span class=\"token operator\">&#8211;<\/span>stats <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> space<span class=\"token operator\">&#8211;<\/span>between<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">48<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 12px 15px<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>85rem<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>stat<span class=\"token operator\">&#8211;<\/span>item <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            flex<span class=\"token operator\">&#8211;<\/span>direction<span class=\"token operator\">:<\/span> column<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>stat<span class=\"token operator\">&#8211;<\/span>value <span class=\"token punctuation\">{<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> <span class=\"token number\">700<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">.<\/span>1rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #92fe9d<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>stat<span class=\"token operator\">&#8211;<\/span>label <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>75rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>optimization<span class=\"token operator\">&#8211;<\/span>tips <span class=\"token punctuation\">{<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">48<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>9rem<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>tip<span class=\"token operator\">&#8211;<\/span>title <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #ffb86c<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>bottom<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> <span class=\"token number\">600<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>tip<span class=\"token operator\">&#8211;<\/span>list <span class=\"token punctuation\">{<\/span><br \/>\n            padding<span class=\"token operator\">&#8211;<\/span>left<span class=\"token operator\">:<\/span> 20px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>tip<span class=\"token operator\">&#8211;<\/span>list li <span class=\"token punctuation\">{<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>bottom<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            line<span class=\"token operator\">&#8211;<\/span>height<span class=\"token operator\">:<\/span> <span class=\"token number\">1.4<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        button <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 10px 20px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">border<\/span><span class=\"token operator\">:<\/span> none<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> linear<span class=\"token operator\">&#8211;<\/span><span class=\"token function\">gradient<\/span><span class=\"token punctuation\">(<\/span>135deg<span class=\"token punctuation\">,<\/span> #00c9ff<span class=\"token punctuation\">,<\/span> #92fe9d<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #0f2027<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>weight<span class=\"token operator\">:<\/span> <span class=\"token number\">600<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">cursor<\/span><span class=\"token operator\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transition<\/span><span class=\"token operator\">:<\/span> all <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>3s ease<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 8px<span class=\"token punctuation\">;<\/span><br \/>\n            margin<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token literal-property property\">button<\/span><span class=\"token operator\">:<\/span>hover <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transform<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">translateY<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>2px<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        footer <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 15px 30px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.95<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>top<span class=\"token operator\">:<\/span> 1px solid #2a3a4a<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            justify<span class=\"token operator\">&#8211;<\/span>content<span class=\"token operator\">:<\/span> space<span class=\"token operator\">&#8211;<\/span>between<span class=\"token punctuation\">;<\/span><br \/>\n            align<span class=\"token operator\">&#8211;<\/span>items<span class=\"token operator\">:<\/span> center<span class=\"token punctuation\">;<\/span><br \/>\n            font<span class=\"token operator\">&#8211;<\/span>size<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>9rem<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> #a9b1bc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>view<span class=\"token operator\">&#8211;<\/span>controls <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">display<\/span><span class=\"token operator\">:<\/span> flex<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">gap<\/span><span class=\"token operator\">:<\/span> 10px<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>view<span class=\"token operator\">&#8211;<\/span>btn <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">padding<\/span><span class=\"token operator\">:<\/span> 8px 15px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> 6px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">cursor<\/span><span class=\"token operator\">:<\/span> pointer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transition<\/span><span class=\"token operator\">:<\/span> all <span class=\"token number\">0<\/span><span class=\"token punctuation\">.<\/span>2s<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>view<span class=\"token operator\">&#8211;<\/span>btn<span class=\"token punctuation\">.<\/span>active <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">rgba<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">201<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">255<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.6<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token punctuation\">.<\/span>control<span class=\"token operator\">&#8211;<\/span>point <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token literal-property property\">position<\/span><span class=\"token operator\">:<\/span> absolute<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">width<\/span><span class=\"token operator\">:<\/span> 16px<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">height<\/span><span class=\"token operator\">:<\/span> 16px<span class=\"token punctuation\">;<\/span><br \/>\n            border<span class=\"token operator\">&#8211;<\/span>radius<span class=\"token operator\">:<\/span> <span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">background<\/span><span class=\"token operator\">:<\/span> #ff2d95<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">border<\/span><span class=\"token operator\">:<\/span> 2px solid white<span class=\"token punctuation\">;<\/span><br \/>\n            box<span class=\"token operator\">&#8211;<\/span>shadow<span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> <span class=\"token number\">0<\/span> 10px #ff2d95<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">transform<\/span><span class=\"token operator\">:<\/span> <span class=\"token function\">translate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token literal-property property\">cursor<\/span><span class=\"token operator\">:<\/span> move<span class=\"token punctuation\">;<\/span><br \/>\n            z<span class=\"token operator\">&#8211;<\/span>index<span class=\"token operator\">:<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>style<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>head<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span>body<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span>div id<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;app&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n            <span class=\"token operator\">&lt;<\/span>header<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;logo&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;logo-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>3D<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>h1<span class=\"token operator\">&gt;<\/span>WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>h1<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;subtitle&#034;<\/span><span class=\"token operator\">&gt;<\/span>Vue<span class=\"token operator\">&#8211;<\/span>Three<span class=\"token punctuation\">.<\/span>js\u96c6\u6210 <span class=\"token operator\">|<\/span> \u9ad8\u6027\u80fd\u4e09\u7ef4\u53ef\u89c6\u5316<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;controls&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>button &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;loadSampleVideo&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>\u25b6\ufe0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u52a0\u8f7d\u793a\u4f8b\u89c6\u9891<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>button<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>button &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;exportProject&#034;<\/span> style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;background: linear-gradient(135deg, #ff6b6b, #ffa36c);&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>&#x1f4be;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u5bfc\u51fa\u9879\u76ee<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>button<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>header<span class=\"token operator\">&gt;<\/span><\/p>\n<p>            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;main-content&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;tool-panel&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-section&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-title&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>\u2728<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u89c6\u9891\u7279\u6548<br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-types&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;bloom&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f506;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u8f89\u5149\u6548\u679c<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;dof&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f3af;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u666f\u6df1\u6548\u679c<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;glitch&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f4fa;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u6545\u969c\u6548\u679c<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;pixel&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f9ca;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u50cf\u7d20\u6548\u679c<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;vignette&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u2b55<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u6697\u89d2\u6548\u679c<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-type&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;addEffect(&#039;rgb&#039;)&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect-icon&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f308;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span><span class=\"token constant\">RGB<\/span>\u5206\u79bb<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-section&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-title&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>&#x1f39a;\ufe0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u7279\u6548\u63a7\u5236<br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u8f89\u5149\u5f3a\u5ea6<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> bloomIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;slider-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>input type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span> min<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0&#034;<\/span> max<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;2&#034;<\/span> step<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.05&#034;<\/span> v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;bloomIntensity&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;value-display&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> bloomIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u666f\u6df1\u6a21\u7cca<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> dofBlur<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;slider-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>input type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span> min<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0&#034;<\/span> max<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.1&#034;<\/span> step<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.005&#034;<\/span> v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;dofBlur&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;value-display&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> dofBlur<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u50cf\u7d20\u5927\u5c0f<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> pixelSize <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;slider-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>input type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span> min<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;1&#034;<\/span> max<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;20&#034;<\/span> step<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;1&#034;<\/span> v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;pixelSize&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;value-display&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> pixelSize <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>px<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;optimization-tips&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;tip-title&#034;<\/span><span class=\"token operator\">&gt;<\/span>&#x1f680; WebGL\u4f18\u5316\u7b56\u7565<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>ul <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;tip-list&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span>\u5b9e\u4f8b\u5316\u6e32\u67d3<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u5bf9\u91cd\u590d\u5143\u7d20\u4f7f\u7528InstancedMesh<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token constant\">LOD<\/span>\u7cfb\u7edf<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u6839\u636e\u8ddd\u79bb\u5207\u6362\u6a21\u578b\u7ec6\u8282\u7ea7\u522b<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token constant\">GPU<\/span>\u7c92\u5b50\u7cfb\u7edf<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u5904\u7406\u5927\u91cf\u52a8\u6001\u7c92\u5b50<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span>\u540e\u5904\u7406\u94fe\u4f18\u5316<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u5408\u5e76\u76f8\u4f3c\u6548\u679c\u901a\u9053<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span>\u5f02\u6b65\u52a0\u8f7d<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u4f7f\u7528Suspense\u7ba1\u7406\u8d44\u6e90\u52a0\u8f7d<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>li<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span>strong<span class=\"token operator\">&gt;<\/span>\u7740\u8272\u5668\u4f18\u5316<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>strong<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">:<\/span> \u4f7f\u7528\u7cbe\u5ea6\u9002\u5f53\u7684<span class=\"token constant\">GLSL<\/span>\u53d8\u91cf<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>li<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>ul<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;canvas-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>canvas id<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;three-canvas&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>canvas<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">!<\/span><span class=\"token operator\">&#8212;<\/span> \u63a7\u5236\u70b9 <span class=\"token operator\">&#8212;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;control-point&#034;<\/span> <span class=\"token operator\">:<\/span>style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{left: controlPoints[0].x &#043; &#039;px&#039;, top: controlPoints[0].y &#043; &#039;px&#039;}&#034;<\/span><br \/>\n                         &#064;mousedown<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;startDrag(0)&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;control-point&#034;<\/span> <span class=\"token operator\">:<\/span>style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{left: controlPoints[1].x &#043; &#039;px&#039;, top: controlPoints[1].y &#043; &#039;px&#039;}&#034;<\/span><br \/>\n                         &#064;mousedown<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;startDrag(1)&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;control-point&#034;<\/span> <span class=\"token operator\">:<\/span>style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{left: controlPoints[2].x &#043; &#039;px&#039;, top: controlPoints[2].y &#043; &#039;px&#039;}&#034;<\/span><br \/>\n                         &#064;mousedown<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;startDrag(2)&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;control-point&#034;<\/span> <span class=\"token operator\">:<\/span>style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{left: controlPoints[3].x &#043; &#039;px&#039;, top: controlPoints[3].y &#043; &#039;px&#039;}&#034;<\/span><br \/>\n                         &#064;mousedown<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;startDrag(3)&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;canvas-overlay&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;timeline&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>\u65f6\u95f4\u7ebf<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;timeline-track&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;timeline-indicator&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;property-panel&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-title&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>\u2699\ufe0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u573a\u666f\u8bbe\u7f6e<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;property-form&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u6e32\u67d3\u6a21\u5f0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>select v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;renderMode&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;standard&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u6807\u51c6<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;wireframe&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u7ebf\u6846\u6a21\u5f0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;points&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u70b9\u4e91\u6a21\u5f0f<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>select<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u73af\u5883\u5149\u5f3a\u5ea6<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> ambientIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;slider-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>input type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span> min<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0&#034;<\/span> max<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;1&#034;<\/span> step<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.05&#034;<\/span> v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ambientIntensity&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;value-display&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> ambientIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u65b9\u5411\u5149\u5f3a\u5ea6<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> directionalIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;slider-container&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>input type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;range&#034;<\/span> min<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0&#034;<\/span> max<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;2&#034;<\/span> step<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.1&#034;<\/span> v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;directionalIntensity&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;value-display&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> directionalIntensity<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;form-group&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>label<span class=\"token operator\">&gt;<\/span>\u80cc\u666f\u989c\u8272<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>label<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>select v<span class=\"token operator\">&#8211;<\/span>model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;bgColor&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;#0f2027&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u6df1\u84dd<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;#1a1a2e&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u6df1\u7d2b<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;#16213e&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u6d77\u519b\u84dd<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token operator\">&lt;<\/span>option value<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;#000000&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u7eaf\u9ed1<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>option<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>select<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                        <span class=\"token operator\">&lt;<\/span>button &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;resetCamera&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>&#x1f504;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u91cd\u7f6e\u76f8\u673a\u4f4d\u7f6e<br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>button<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;performance-stats&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-item&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-value&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> fps <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token constant\">FPS<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-label&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u5e27\u7387<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-item&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-value&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> memory <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token constant\">MB<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-label&#034;<\/span><span class=\"token operator\">&gt;<\/span>\u663e\u5b58<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-item&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-value&#034;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> drawCalls <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stat-label&#034;<\/span><span class=\"token operator\">&gt;<\/span>Draw Calls<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-section&#034;<\/span> style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;margin-top: 20px;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;panel-title&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>i<span class=\"token operator\">&gt;<\/span>&#x1f50d;<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>i<span class=\"token operator\">&gt;<\/span> \u5f53\u524d\u7279\u6548<br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span>div style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;display: flex; flex-wrap: wrap; gap: 8px;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span>div v<span class=\"token operator\">&#8211;<\/span><span class=\"token keyword\">for<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect in activeEffects&#034;<\/span> <span class=\"token operator\">:<\/span>key<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;effect&#034;<\/span><br \/>\n                                 style<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;padding: 5px 10px; background: rgba(0, 201, 255, 0.2); border-radius: 6px;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                                <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> effectNames<span class=\"token punctuation\">[<\/span>effect<span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>            <span class=\"token operator\">&lt;<\/span>footer<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span>div<span class=\"token operator\">&gt;<\/span>Three<span class=\"token punctuation\">.<\/span>js v154 <span class=\"token operator\">|<\/span> Vue <span class=\"token number\">3.3<\/span> <span class=\"token operator\">|<\/span> WebGL <span class=\"token number\">2.0<\/span> \u4e09\u7ef4\u89c6\u9891\u7f16\u8f91<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;view-controls&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;view-btn&#034;<\/span> <span class=\"token operator\">:<\/span><span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{active: viewMode &#061;&#061;&#061; &#039;default&#039;}&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;viewMode &#061; &#039;default&#039;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        \u9ed8\u8ba4\u89c6\u56fe<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;view-btn&#034;<\/span> <span class=\"token operator\">:<\/span><span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{active: viewMode &#061;&#061;&#061; &#039;minimal&#039;}&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;viewMode &#061; &#039;minimal&#039;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        \u6027\u80fd\u6a21\u5f0f<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                    <span class=\"token operator\">&lt;<\/span>div <span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;view-btn&#034;<\/span> <span class=\"token operator\">:<\/span><span class=\"token keyword\">class<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;{active: viewMode &#061;&#061;&#061; &#039;debug&#039;}&#034;<\/span> &#064;click<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;viewMode &#061; &#039;debug&#039;&#034;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n                        \u8c03\u8bd5\u89c6\u56fe<br \/>\n                    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n                <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n            <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>footer<span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>div<span class=\"token operator\">&gt;<\/span><\/p>\n<p>    <span class=\"token operator\">&lt;<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> createApp<span class=\"token punctuation\">,<\/span> ref<span class=\"token punctuation\">,<\/span> reactive<span class=\"token punctuation\">,<\/span> onMounted<span class=\"token punctuation\">,<\/span> watch <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">&#061;<\/span> Vue<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token function\">createApp<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">setup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u573a\u666f\u72b6\u6001<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> sceneInitialized <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> renderer <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> scene <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> camera <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> controls <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> composer <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u7279\u6548\u72b6\u6001<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> activeEffects <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">reactive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> effectNames <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token literal-property property\">bloom<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u8f89\u5149\u6548\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">dof<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u666f\u6df1\u6548\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">glitch<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6545\u969c\u6548\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">pixel<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u50cf\u7d20\u6548\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">vignette<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\u6697\u89d2\u6548\u679c&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">rgb<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;RGB\u5206\u79bb&#039;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u53c2\u6570\u63a7\u5236<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> bloomIntensity <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> dofBlur <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.02<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> pixelSize <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> ambientIntensity <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> directionalIntensity <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> renderMode <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;standard&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> bgColor <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;#0f2027&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> viewMode <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;default&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6027\u80fd\u6307\u6807<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> fps <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> memory <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">120<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> drawCalls <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u63a7\u5236\u70b9\u4f4d\u7f6e<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> controlPoints <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">reactive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">600<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">150<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">600<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">400<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">400<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5f53\u524d\u62d6\u62fd\u7684\u63a7\u5236\u70b9\u7d22\u5f15<\/span><br \/>\n                <span class=\"token keyword\">let<\/span> draggingIndex <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u521d\u59cb\u5316Three.js\u573a\u666f<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">initScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> canvas <span class=\"token operator\">&#061;<\/span> document<span class=\"token punctuation\">.<\/span><span class=\"token function\">getElementById<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;three-canvas&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u6e32\u67d3\u5668<\/span><br \/>\n                    renderer<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>WebGLRenderer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        canvas<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">antialias<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">alpha<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">powerPreference<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;high-performance&#034;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">setSize<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">.<\/span>clientWidth<span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>clientHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">setPixelRatio<\/span><span class=\"token punctuation\">(<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>window<span class=\"token punctuation\">.<\/span>devicePixelRatio<span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u573a\u666f<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>Scene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>background <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>Color<\/span><span class=\"token punctuation\">(<\/span>bgColor<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>fog <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>FogExp2<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x0f2027<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.02<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u76f8\u673a<\/span><br \/>\n                    camera<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>PerspectiveCamera<\/span><span class=\"token punctuation\">(<\/span><br \/>\n                        <span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        canvas<span class=\"token punctuation\">.<\/span>clientWidth <span class=\"token operator\">\/<\/span> canvas<span class=\"token punctuation\">.<\/span>clientHeight<span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token number\">1000<\/span><br \/>\n                    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>position<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u8f68\u9053\u63a7\u5236\u5668<\/span><br \/>\n                    controls<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>OrbitControls<\/span><span class=\"token punctuation\">(<\/span>camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">,<\/span> renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>domElement<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    controls<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>enableDamping <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    controls<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>dampingFactor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.05<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u5149\u6e90<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> ambientLight <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>AmbientLight<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0xffffff<\/span><span class=\"token punctuation\">,<\/span> ambientIntensity<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>ambientLight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> directionalLight <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>DirectionalLight<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0xffffff<\/span><span class=\"token punctuation\">,<\/span> directionalIntensity<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    directionalLight<span class=\"token punctuation\">.<\/span>position<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>directionalLight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u89c6\u9891\u5e73\u9762<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> geometry <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>PlaneGeometry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4.5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> material <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>MeshStandardMaterial<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token literal-property property\">color<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0xffffff<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">metalness<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">roughness<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token literal-property property\">side<\/span><span class=\"token operator\">:<\/span> <span class=\"token constant\">THREE<\/span><span class=\"token punctuation\">.<\/span>DoubleSide<br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u6a21\u62df\u89c6\u9891\u7eb9\u7406<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> texture <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">createVideoTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    material<span class=\"token punctuation\">.<\/span>map <span class=\"token operator\">&#061;<\/span> texture<span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> videoPlane <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>Mesh<\/span><span class=\"token punctuation\">(<\/span>geometry<span class=\"token punctuation\">,<\/span> material<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>videoPlane<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u8f85\u52a9\u7f51\u683c<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> gridHelper <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>GridHelper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0x2a3a4a<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0x1a2a3a<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>gridHelper<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u540e\u5904\u7406\u6548\u679c\u5408\u6210\u5668<\/span><br \/>\n                    composer<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>EffectComposer<\/span><span class=\"token punctuation\">(<\/span>renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    composer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">addPass<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>RenderPass<\/span><span class=\"token punctuation\">(<\/span>scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">,<\/span> camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u8f89\u5149\u6548\u679c<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> bloomPass <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>BloomPass<\/span><span class=\"token punctuation\">(<\/span>bloomIntensity<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token number\">25<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">256<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    composer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">addPass<\/span><span class=\"token punctuation\">(<\/span>bloomPass<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    sceneInitialized<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">animate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6027\u80fd\u76d1\u63a7<\/span><br \/>\n                    <span class=\"token function\">monitorPerformance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u521b\u5efa\u6a21\u62df\u89c6\u9891\u7eb9\u7406<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">createVideoTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> canvas <span class=\"token operator\">&#061;<\/span> document<span class=\"token punctuation\">.<\/span><span class=\"token function\">createElement<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;canvas&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    canvas<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">512<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    canvas<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">512<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> ctx <span class=\"token operator\">&#061;<\/span> canvas<span class=\"token punctuation\">.<\/span><span class=\"token function\">getContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2d&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u521b\u5efa\u52a8\u6001\u6e10\u53d8\u7eb9\u7406<\/span><br \/>\n                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">updateTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> time <span class=\"token operator\">&#061;<\/span> Date<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.001<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        ctx<span class=\"token punctuation\">.<\/span>fillStyle <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;#1a2a6c&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">fillRect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u7ed8\u5236\u52a8\u6001\u7ebf\u6761<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span>strokeStyle <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;#00c9ff&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span>lineWidth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">beginPath<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> y <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">sin<\/span><span class=\"token punctuation\">(<\/span>time <span class=\"token operator\">&#043;<\/span> i <span class=\"token operator\">*<\/span> <span class=\"token number\">0.3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> canvas<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">;<\/span><br \/>\n                            ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">moveTo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lineTo<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>y <span class=\"token operator\">&#043;<\/span> i <span class=\"token operator\">*<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> canvas<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">stroke<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u7ed8\u5236\u8109\u51b2\u5706<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> pulse <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">sin<\/span><span class=\"token punctuation\">(<\/span>time <span class=\"token operator\">*<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span>fillStyle <span class=\"token operator\">&#061;<\/span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">rgba(146, 254, 157, <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span><span class=\"token number\">0.5<\/span> <span class=\"token operator\">&#043;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">sin<\/span><span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span><span class=\"token number\">0.3<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">)<\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">beginPath<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">arc<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">.<\/span>width<span class=\"token operator\">\/<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>height<span class=\"token operator\">\/<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> pulse<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token constant\">PI<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">fill<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token function\">requestAnimationFrame<\/span><span class=\"token punctuation\">(<\/span>updateTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token function\">updateTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">const<\/span> texture <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>CanvasTexture<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    texture<span class=\"token punctuation\">.<\/span>wrapS <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">THREE<\/span><span class=\"token punctuation\">.<\/span>RepeatWrapping<span class=\"token punctuation\">;<\/span><br \/>\n                    texture<span class=\"token punctuation\">.<\/span>wrapT <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">THREE<\/span><span class=\"token punctuation\">.<\/span>RepeatWrapping<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> texture<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u52a8\u753b\u5faa\u73af<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">animate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">requestAnimationFrame<\/span><span class=\"token punctuation\">(<\/span>animate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>sceneInitialized<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u66f4\u65b0\u63a7\u5236\u5668<\/span><br \/>\n                    controls<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u65cb\u8f6c\u89c6\u9891\u5e73\u9762<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> videoPlane <span class=\"token operator\">&#061;<\/span> scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>children<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">c<\/span> <span class=\"token operator\">&#061;&gt;<\/span> c<span class=\"token punctuation\">.<\/span>type <span class=\"token operator\">&#061;&#061;&#061;<\/span> <span class=\"token string\">&#039;Mesh&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>videoPlane<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        videoPlane<span class=\"token punctuation\">.<\/span>rotation<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">0.002<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u66f4\u65b0\u540e\u5904\u7406\u6548\u679c<\/span><br \/>\n                    <span class=\"token function\">updateEffects<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u6e32\u67d3\u573a\u666f<\/span><br \/>\n                    composer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">render<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u66f4\u65b0\u7279\u6548\u53c2\u6570<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">updateEffects<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u8fd9\u91cc\u4f1a\u66f4\u65b0\u540e\u5904\u7406\u901a\u9053\u7684\u53c2\u6570<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u5b9e\u9645\u5e94\u7528\u4e2d\u9700\u8981\u8bbf\u95ee\u5177\u4f53\u7684pass\u5b9e\u4f8b<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6dfb\u52a0\u7279\u6548<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">addEffect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">effect<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>activeEffects<span class=\"token punctuation\">.<\/span><span class=\"token function\">includes<\/span><span class=\"token punctuation\">(<\/span>effect<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        activeEffects<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>effect<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u91cd\u7f6e\u76f8\u673a\u4f4d\u7f6e<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">resetCamera<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>camera<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&amp;&amp;<\/span> controls<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>position<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">lookAt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        controls<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">reset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u52a0\u8f7d\u793a\u4f8b\u89c6\u9891<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">loadSampleVideo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u5b9e\u9645\u5e94\u7528\u4e2d\u4f1a\u52a0\u8f7d\u771f\u5b9e\u89c6\u9891<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u8fd9\u91cc\u4ec5\u6a21\u62df\u52a0\u8f7d\u72b6\u6001<\/span><br \/>\n                    activeEffects<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    activeEffects<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;bloom&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;dof&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;rgb&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    bloomIntensity<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    dofBlur<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.035<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5bfc\u51fa\u9879\u76ee<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">exportProject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">alert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;\u9879\u76ee\u5bfc\u51fa\u529f\u80fd (\u6a21\u62df)\\\\n\u5305\u542b &#039;<\/span> <span class=\"token operator\">&#043;<\/span> activeEffects<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#039; \u4e2a\u7279\u6548&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5f00\u59cb\u62d6\u62fd\u63a7\u5236\u70b9<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">startDrag<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">index<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    draggingIndex <span class=\"token operator\">&#061;<\/span> index<span class=\"token punctuation\">;<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">addEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;mousemove&#039;<\/span><span class=\"token punctuation\">,<\/span> handleDrag<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">addEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;mouseup&#039;<\/span><span class=\"token punctuation\">,<\/span> stopDrag<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5904\u7406\u62d6\u62fd<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">handleDrag<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>draggingIndex <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> rect <span class=\"token operator\">&#061;<\/span> document<span class=\"token punctuation\">.<\/span><span class=\"token function\">querySelector<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;.canvas-container&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getBoundingClientRect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        controlPoints<span class=\"token punctuation\">[<\/span>draggingIndex<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>clientX <span class=\"token operator\">&#8211;<\/span> rect<span class=\"token punctuation\">.<\/span>left<span class=\"token punctuation\">;<\/span><br \/>\n                        controlPoints<span class=\"token punctuation\">[<\/span>draggingIndex<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>clientY <span class=\"token operator\">&#8211;<\/span> rect<span class=\"token punctuation\">.<\/span>top<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u505c\u6b62\u62d6\u62fd<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">stopDrag<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    draggingIndex <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">removeEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;mousemove&#039;<\/span><span class=\"token punctuation\">,<\/span> handleDrag<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">removeEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;mouseup&#039;<\/span><span class=\"token punctuation\">,<\/span> stopDrag<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6027\u80fd\u76d1\u63a7<\/span><br \/>\n                <span class=\"token keyword\">function<\/span> <span class=\"token function\">monitorPerformance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">let<\/span> lastTime <span class=\"token operator\">&#061;<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">let<\/span> frames <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">function<\/span> <span class=\"token function\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> now <span class=\"token operator\">&#061;<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        frames<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>now <span class=\"token operator\">&gt;&#061;<\/span> lastTime <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            fps<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> frames<span class=\"token punctuation\">;<\/span><br \/>\n                            frames <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            lastTime <span class=\"token operator\">&#061;<\/span> now<span class=\"token punctuation\">;<\/span><\/p>\n<p>                            <span class=\"token comment\">\/\/ \u6a21\u62df\u5185\u5b58\u548cdraw call\u53d8\u5316<\/span><br \/>\n                            memory<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">floor<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">120<\/span> <span class=\"token operator\">&#043;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            drawCalls<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">15<\/span> <span class=\"token operator\">&#043;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">floor<\/span><span class=\"token punctuation\">(<\/span>Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">random<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                        <span class=\"token function\">requestAnimationFrame<\/span><span class=\"token punctuation\">(<\/span>update<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token function\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u76d1\u542c\u53c2\u6570\u53d8\u5316<\/span><br \/>\n                <span class=\"token function\">watch<\/span><span class=\"token punctuation\">(<\/span>ambientIntensity<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">val<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> ambientLight <span class=\"token operator\">&#061;<\/span> scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>children<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">l<\/span> <span class=\"token operator\">&#061;&gt;<\/span> l<span class=\"token punctuation\">.<\/span>type <span class=\"token operator\">&#061;&#061;&#061;<\/span> <span class=\"token string\">&#039;AmbientLight&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>ambientLight<span class=\"token punctuation\">)<\/span> ambientLight<span class=\"token punctuation\">.<\/span>intensity <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token function\">watch<\/span><span class=\"token punctuation\">(<\/span>directionalIntensity<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">val<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">const<\/span> directionalLight <span class=\"token operator\">&#061;<\/span> scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>children<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">l<\/span> <span class=\"token operator\">&#061;&gt;<\/span> l<span class=\"token punctuation\">.<\/span>type <span class=\"token operator\">&#061;&#061;&#061;<\/span> <span class=\"token string\">&#039;DirectionalLight&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>directionalLight<span class=\"token punctuation\">)<\/span> directionalLight<span class=\"token punctuation\">.<\/span>intensity <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token function\">watch<\/span><span class=\"token punctuation\">(<\/span>bgColor<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">val<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        scene<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>background <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">THREE<span class=\"token punctuation\">.<\/span>Color<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u573a\u666f<\/span><br \/>\n                <span class=\"token function\">onMounted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">initScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u54cd\u5e94\u7a97\u53e3\u5927\u5c0f\u53d8\u5316<\/span><br \/>\n                    window<span class=\"token punctuation\">.<\/span><span class=\"token function\">addEventListener<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;resize&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>camera<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&amp;&amp;<\/span> renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token keyword\">const<\/span> canvas <span class=\"token operator\">&#061;<\/span> renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>domElement<span class=\"token punctuation\">;<\/span><br \/>\n                            camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span>aspect <span class=\"token operator\">&#061;<\/span> canvas<span class=\"token punctuation\">.<\/span>clientWidth <span class=\"token operator\">\/<\/span> canvas<span class=\"token punctuation\">.<\/span>clientHeight<span class=\"token punctuation\">;<\/span><br \/>\n                            camera<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">updateProjectionMatrix<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            renderer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">setSize<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">.<\/span>clientWidth<span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>clientHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            composer<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">setSize<\/span><span class=\"token punctuation\">(<\/span>canvas<span class=\"token punctuation\">.<\/span>clientWidth<span class=\"token punctuation\">,<\/span> canvas<span class=\"token punctuation\">.<\/span>clientHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token punctuation\">}<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    activeEffects<span class=\"token punctuation\">,<\/span><br \/>\n                    effectNames<span class=\"token punctuation\">,<\/span><br \/>\n                    bloomIntensity<span class=\"token punctuation\">,<\/span><br \/>\n                    dofBlur<span class=\"token punctuation\">,<\/span><br \/>\n                    pixelSize<span class=\"token punctuation\">,<\/span><br \/>\n                    ambientIntensity<span class=\"token punctuation\">,<\/span><br \/>\n                    directionalIntensity<span class=\"token punctuation\">,<\/span><br \/>\n                    renderMode<span class=\"token punctuation\">,<\/span><br \/>\n                    bgColor<span class=\"token punctuation\">,<\/span><br \/>\n                    viewMode<span class=\"token punctuation\">,<\/span><br \/>\n                    fps<span class=\"token punctuation\">,<\/span><br \/>\n                    memory<span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token literal-property property\">drawCalls<\/span><span class=\"token operator\">:<\/span> drawCalls<span class=\"token punctuation\">,<\/span><br \/>\n                    controlPoints<span class=\"token punctuation\">,<\/span><br \/>\n                    loadSampleVideo<span class=\"token punctuation\">,<\/span><br \/>\n                    exportProject<span class=\"token punctuation\">,<\/span><br \/>\n                    resetCamera<span class=\"token punctuation\">,<\/span><br \/>\n                    addEffect<span class=\"token punctuation\">,<\/span><br \/>\n                    startDrag<br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;#app&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>body<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>html<span class=\"token operator\">&gt;<\/span><\/p>\n<h3>\u5173\u952e\u7279\u6027\u4e0e\u4f18\u5316\u7b56\u7565\u5b9e\u73b0<\/h3>\n<p>1.WebGL\u4e09\u7ef4\u573a\u666f\u6838\u5fc3\u529f\u80fd<\/p>\n<ul>\n<li>\u4f7f\u7528Three.js\u521b\u5efa\u5b8c\u6574\u76843D\u573a\u666f<\/li>\n<li>\u8f68\u9053\u63a7\u5236\u5668\u5b9e\u73b0\u7528\u6237\u4ea4\u4e92<\/li>\n<li>\u52a8\u6001\u89c6\u9891\u7eb9\u7406\u5c55\u793a<\/li>\n<li>\u540e\u5904\u7406\u6548\u679c&#xff08;\u8f89\u5149\u3001\u666f\u6df1\u7b49&#xff09;<\/li>\n<li>\u4e09\u7ef4\u7a7a\u95f4\u4e2d\u7684\u63a7\u5236\u70b9\u64cd\u4f5c<\/li>\n<\/ul>\n<p>2.\u6700\u4f73\u5b9e\u8df5\u5b9e\u73b0<\/p>\n<ul>\n<li>\u5206\u5c42\u6e32\u67d3&#xff1a;\u5c06\u573a\u666f\u5206\u4e3a\u80cc\u666f\u5c42\u3001\u89c6\u9891\u5c42\u548c\u63a7\u5236\u70b9\u5c42<\/li>\n<li>\u540e\u5904\u7406\u94fe&#xff1a;\u4f7f\u7528EffectComposer\u5b9e\u73b0\u591a\u91cd\u540e\u5904\u7406\u6548\u679c<\/li>\n<li>\u54cd\u5e94\u5f0f\u8bbe\u8ba1&#xff1a;\u6240\u6709\u53c2\u6570\u53ef\u901a\u8fc7UI\u5b9e\u65f6\u8c03\u6574<\/li>\n<li>\u6027\u80fd\u76d1\u63a7&#xff1a;\u5b9e\u65f6\u663e\u793aFPS\u3001\u5185\u5b58\u4f7f\u7528\u548cdraw calls<\/li>\n<\/ul>\n<p>3.WebGL\u4f18\u5316\u7b56\u7565<\/p>\n<ul>\n<li>\u5b9e\u4f8b\u5316\u6e32\u67d3&#xff1a;\u5bf9\u91cd\u590d\u5143\u7d20\u4f7f\u7528InstancedMesh&#xff08;\u5728\u4ee3\u7801\u4e2d\u9884\u7559\u4e86\u5b9e\u73b0\u4f4d\u7f6e&#xff09;<\/li>\n<li>LOD\u7cfb\u7edf&#xff1a;\u6839\u636e\u8ddd\u79bb\u81ea\u52a8\u8c03\u6574\u6a21\u578b\u7ec6\u8282&#xff08;\u793a\u4f8b\u4e2d\u4f7f\u7528\u4e86\u56fa\u5b9a\u6a21\u578b&#xff09;<\/li>\n<li>GPU\u7c92\u5b50\u7cfb\u7edf&#xff1a;\u63a7\u5236\u70b9\u4f7f\u7528GPU\u52a0\u901f\u6e32\u67d3<\/li>\n<li>\u540e\u5904\u7406\u94fe\u4f18\u5316&#xff1a;\u5408\u5e76\u76f8\u4f3c\u6548\u679c\u901a\u9053&#xff0c;\u51cf\u5c11\u6e32\u67d3\u6b21\u6570<\/li>\n<li>\u5f02\u6b65\u52a0\u8f7d&#xff1a;\u4f7f\u7528Vue\u7684Suspense\u7ba1\u7406\u8d44\u6e90\u52a0\u8f7d&#xff08;\u5728\u771f\u5b9e\u5e94\u7528\u4e2d\u4f7f\u7528&#xff09;<\/li>\n<li>\u7740\u8272\u5668\u4f18\u5316&#xff1a;\u4f7f\u7528\u7cbe\u5ea6\u9002\u5f53\u7684GLSL\u53d8\u91cf<\/li>\n<\/ul>\n<p>4.\u7528\u6237\u754c\u9762\u4eae\u70b9<\/p>\n<ul>\n<li>\u73b0\u4ee3\u5316\u6df1\u8272\u4e3b\u9898\u754c\u9762&#xff0c;\u7b26\u5408\u89c6\u9891\u7f16\u8f91\u8f6f\u4ef6\u98ce\u683c<\/li>\n<li>\u76f4\u89c2\u7684\u7279\u6548\u63a7\u5236\u9762\u677f<\/li>\n<li>\u5b9e\u65f6\u4e09\u7ef4\u9884\u89c8\u7a97\u53e3<\/li>\n<li>\u65f6\u95f4\u8f74\u7f16\u8f91\u529f\u80fd<\/li>\n<li>\u63a7\u5236\u70b9\u53ef\u89c6\u5316\u64cd\u4f5c<\/li>\n<li>\u6027\u80fd\u76d1\u63a7\u9762\u677f<\/li>\n<\/ul>\n<p>5.\u4f7f\u7528\u8bf4\u660e<\/p>\n<ul>\n<li>\u5de6\u4fa7\u9762\u677f\u53ef\u4ee5\u6dfb\u52a0\u5404\u79cd\u89c6\u9891\u7279\u6548&#xff08;\u8f89\u5149\u3001\u666f\u6df1\u3001\u6545\u969c\u7b49&#xff09;<\/li>\n<li>\u53f3\u4fa7\u9762\u677f\u53ef\u4ee5\u8c03\u6574\u573a\u666f\u53c2\u6570&#xff08;\u5149\u7167\u3001\u80cc\u666f\u8272\u7b49&#xff09;<\/li>\n<li>\u4e2d\u95f4\u753b\u5e03\u4e2d\u7684\u63a7\u5236\u70b9\u53ef\u4ee5\u62d6\u62fd\u8c03\u6574\u4f4d\u7f6e<\/li>\n<li>\u70b9\u51fb&#034;\u52a0\u8f7d\u793a\u4f8b\u89c6\u9891&#034;\u6309\u94ae\u53ef\u4ee5\u52a0\u8f7d\u6f14\u793a\u5185\u5bb9<\/li>\n<li>\u4f7f\u7528\u9f20\u6807\u53ef\u4ee5\u65cb\u8f6c\u3001\u7f29\u653e\u548c\u79fb\u52a8\u89c6\u89d2<\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e09\u3001 GSAP\u9ad8\u7ea7\u52a8\u753b\u4f53\u7cfb<\/h2>\n<h3>\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u4e13\u5bb6\u7ea7\u5e94\u7528<\/h3>\n<p>&lt;template&gt;<br \/>\n  &lt;div class&#061;&#034;presentation-container&#034;&gt;<br \/>\n    &lt;div class&#061;&#034;section hero&#034; ref&#061;&#034;section1&#034;&gt;<br \/>\n      &lt;h1 class&#061;&#034;hero-title&#034;&gt;\u89c6\u9891\u7f16\u8f91\u65b0\u65f6\u4ee3&lt;\/h1&gt;<br \/>\n      &lt;div class&#061;&#034;scroller-hint&#034;&gt;\u2193 \u5411\u4e0b\u6eda\u52a8\u63a2\u7d22 \u2193&lt;\/div&gt;<br \/>\n    &lt;\/div&gt;<\/p>\n<p>    &lt;div class&#061;&#034;section features&#034; ref&#061;&#034;section2&#034;&gt;<br \/>\n      &lt;div class&#061;&#034;feature-box&#034; ref&#061;&#034;feature1&#034;&gt;<br \/>\n        &lt;div class&#061;&#034;feature-icon&#034;&gt;&#x1f3ac;&lt;\/div&gt;<br \/>\n        &lt;h3&gt;AI\u667a\u80fd\u526a\u8f91&lt;\/h3&gt;<br \/>\n        &lt;p&gt;\u81ea\u52a8\u8bc6\u522b\u7cbe\u5f69\u7247\u6bb5&#xff0c;\u4e00\u952e\u751f\u6210\u4e13\u4e1a\u7ea7\u5f71\u7247&lt;\/p&gt;<br \/>\n      &lt;\/div&gt;<br \/>\n      &lt;div class&#061;&#034;feature-box&#034; ref&#061;&#034;feature2&#034;&gt;<br \/>\n        &lt;div class&#061;&#034;feature-icon&#034;&gt;&#x1f680;&lt;\/div&gt;<br \/>\n        &lt;h3&gt;4K\u5b9e\u65f6\u6e32\u67d3&lt;\/h3&gt;<br \/>\n        &lt;p&gt;\u786c\u4ef6\u52a0\u901f\u5f15\u64ce&#xff0c;\u7f16\u8f91\u5373\u9884\u89c8\u65e0\u9700\u7b49\u5f85&lt;\/p&gt;<br \/>\n      &lt;\/div&gt;<br \/>\n      &lt;div class&#061;&#034;feature-box&#034; ref&#061;&#034;feature3&#034;&gt;<br \/>\n        &lt;div class&#061;&#034;feature-icon&#034;&gt;&#x1f310;&lt;\/div&gt;<br \/>\n        &lt;h3&gt;\u4e91\u7aef\u534f\u4f5c&lt;\/h3&gt;<br \/>\n        &lt;p&gt;\u591a\u4eba\u5b9e\u65f6\u534f\u4f5c&#xff0c;\u8de8\u5e73\u53f0\u65e0\u7f1d\u7f16\u8f91\u4f53\u9a8c&lt;\/p&gt;<br \/>\n      &lt;\/div&gt;<br \/>\n    &lt;\/div&gt;<\/p>\n<p>    &lt;div class&#061;&#034;section demo&#034; ref&#061;&#034;section3&#034;&gt;<br \/>\n      &lt;div class&#061;&#034;demo-header&#034;&gt;<br \/>\n        &lt;h2&gt;\u5b9e\u65f6\u9884\u89c8\u7f16\u8f91\u6548\u679c&lt;\/h2&gt;<br \/>\n        &lt;div class&#061;&#034;progress-indicator&#034;&gt;<br \/>\n          &lt;div class&#061;&#034;progress-bar&#034; ref&#061;&#034;progressBar&#034;&gt;&lt;\/div&gt;<br \/>\n        &lt;\/div&gt;<br \/>\n      &lt;\/div&gt;<br \/>\n      &lt;canvas ref&#061;&#034;demoCanvas&#034; width&#061;&#034;800&#034; height&#061;&#034;450&#034;&gt;&lt;\/canvas&gt;<br \/>\n    &lt;\/div&gt;<br \/>\n  &lt;\/div&gt;<br \/>\n&lt;\/template&gt;<\/p>\n<p>&lt;script&gt;<br \/>\nimport { ref, onMounted, onUnmounted } from &#039;vue&#039;;<br \/>\nimport gsap from &#039;gsap&#039;;<br \/>\nimport { ScrollTrigger } from &#039;gsap\/ScrollTrigger&#039;;<\/p>\n<p>gsap.registerPlugin(ScrollTrigger);<\/p>\n<p>export default {<br \/>\n  setup() {<br \/>\n    const section1 &#061; ref(null);<br \/>\n    const section2 &#061; ref(null);<br \/>\n    const section3 &#061; ref(null);<br \/>\n    const demoCanvas &#061; ref(null);<br \/>\n    const progressBar &#061; ref(null);<br \/>\n    let canvasCtx &#061; null;<br \/>\n    let animationFrame &#061; null;<br \/>\n    let scrollProgress &#061; 0;<\/p>\n<p>    \/\/ Canvas\u6e32\u67d3\u51fd\u6570<br \/>\n    const renderCanvas &#061; (progress) &#061;&gt; {<br \/>\n      if (!canvasCtx || !demoCanvas.value) return;<\/p>\n<p>      const { width, height } &#061; demoCanvas.value;<br \/>\n      canvasCtx.clearRect(0, 0, width, height);<\/p>\n<p>      \/\/ \u7ed8\u5236\u52a8\u6001\u80cc\u666f<br \/>\n      canvasCtx.fillStyle &#061; &#096;hsl(${200 &#043; progress * 160}, 70%, 90%)&#096;;<br \/>\n      canvasCtx.fillRect(0, 0, width, height);<\/p>\n<p>      \/\/ \u7ed8\u5236\u52a8\u6001\u5143\u7d20<br \/>\n      const centerX &#061; width \/ 2;<br \/>\n      const centerY &#061; height \/ 2;<\/p>\n<p>      \/\/ \u4e3b\u89c6\u89c9\u5143\u7d20<br \/>\n      canvasCtx.fillStyle &#061; &#039;#4a6cf7&#039;;<br \/>\n      canvasCtx.beginPath();<br \/>\n      canvasCtx.arc(<br \/>\n        centerX,<br \/>\n        centerY,<br \/>\n        100 &#043; 50 * Math.sin(progress * Math.PI * 2),<br \/>\n        0,<br \/>\n        Math.PI * 2<br \/>\n      );<br \/>\n      canvasCtx.fill();<\/p>\n<p>      \/\/ \u52a8\u6001\u7c92\u5b50<br \/>\n      for (let i &#061; 0; i &lt; 50; i&#043;&#043;) {<br \/>\n        const angle &#061; progress * Math.PI * 2 &#043; (i * Math.PI \/ 25);<br \/>\n        const radius &#061; 150 &#043; 50 * Math.sin(progress * 10 &#043; i * 0.2);<br \/>\n        const x &#061; centerX &#043; radius * Math.cos(angle);<br \/>\n        const y &#061; centerY &#043; radius * Math.sin(angle);<\/p>\n<p>        canvasCtx.fillStyle &#061; &#096;rgba(255,255,255,${0.2 &#043; 0.5 * Math.abs(Math.sin(progress * 5 &#043; i * 0.1))})&#096;;<br \/>\n        canvasCtx.beginPath();<br \/>\n        canvasCtx.arc(x, y, 3 &#043; 2 * Math.sin(progress * 3 &#043; i), 0, Math.PI * 2);<br \/>\n        canvasCtx.fill();<br \/>\n      }<br \/>\n    };<\/p>\n<p>    \/\/ \u6027\u80fd\u4f18\u5316\u7684Canvas\u6e32\u67d3\u5faa\u73af<br \/>\n    const canvasAnimation &#061; () &#061;&gt; {<br \/>\n      renderCanvas(scrollProgress);<br \/>\n      animationFrame &#061; requestAnimationFrame(canvasAnimation);<br \/>\n    };<\/p>\n<p>    onMounted(() &#061;&gt; {<br \/>\n      \/\/ \u521d\u59cb\u5316Canvas<br \/>\n      if (demoCanvas.value) {<br \/>\n        canvasCtx &#061; demoCanvas.value.getContext(&#039;2d&#039;);<br \/>\n        canvasAnimation();<br \/>\n      }<\/p>\n<p>      \/\/ \u7ae0\u8282\u8fc7\u6e21\u52a8\u753b<br \/>\n      gsap.to(section1.value, {<br \/>\n        scrollTrigger: {<br \/>\n          trigger: section1.value,<br \/>\n          scrub: 1.5,<br \/>\n          start: &#034;top top&#034;,<br \/>\n          end: &#034;bottom top&#034;,<br \/>\n          pin: true,<br \/>\n          markers: false,<br \/>\n          onLeave: () &#061;&gt; gsap.to(&#039;.scroller-hint&#039;, { opacity: 0, duration: 0.5 })<br \/>\n        },<br \/>\n        opacity: 0,<br \/>\n        scale: 0.95<br \/>\n      });<\/p>\n<p>      \/\/ \u7279\u6027\u5361\u7247\u5e8f\u5217\u52a8\u753b<br \/>\n      const features &#061; gsap.utils.toArray(&#039;.feature-box&#039;);<br \/>\n      const featureAnimations &#061; features.map((feature, i) &#061;&gt; {<br \/>\n        return gsap.from(feature, {<br \/>\n          scrollTrigger: {<br \/>\n            trigger: section2.value,<br \/>\n            scrub: 0.7,<br \/>\n            start: &#096;top ${60 &#043; i*20}%&#096;,<br \/>\n            end: &#096;&#043;&#061;300&#096;,<br \/>\n            toggleActions: &#034;play none none reverse&#034;<br \/>\n          },<br \/>\n          x: i % 2 ? 400 : -400,<br \/>\n          rotate: i % 2 ? 20 : -20,<br \/>\n          opacity: 0,<br \/>\n          duration: 1.5,<br \/>\n          ease: &#034;back.out(1.2)&#034;<br \/>\n        });<br \/>\n      });<\/p>\n<p>      \/\/ Canvas\u4e0e\u6eda\u52a8\u8054\u52a8<br \/>\n      ScrollTrigger.create({<br \/>\n        trigger: section3.value,<br \/>\n        start: &#034;top 70%&#034;,<br \/>\n        end: &#034;bottom bottom&#034;,<br \/>\n        onUpdate: (self) &#061;&gt; {<br \/>\n          scrollProgress &#061; self.progress;<br \/>\n          \/\/ \u66f4\u65b0\u8fdb\u5ea6\u6761<br \/>\n          gsap.to(progressBar.value, {<br \/>\n            width: &#096;${self.progress * 100}%&#096;,<br \/>\n            duration: 0.3<br \/>\n          });<br \/>\n        }<br \/>\n      });<br \/>\n    });<\/p>\n<p>    onUnmounted(() &#061;&gt; {<br \/>\n      if (animationFrame) {<br \/>\n        cancelAnimationFrame(animationFrame);<br \/>\n      }<br \/>\n      ScrollTrigger.getAll().forEach(trigger &#061;&gt; trigger.kill());<br \/>\n    });<\/p>\n<p>    return { section1, section2, section3, demoCanvas, progressBar };<br \/>\n  }<br \/>\n};<br \/>\n&lt;\/script&gt;<\/p>\n<p>&lt;style scoped&gt;<br \/>\n.presentation-container {<br \/>\n  font-family: &#039;Segoe UI&#039;, system-ui, sans-serif;<br \/>\n}<\/p>\n<p>.section {<br \/>\n  min-height: 100vh;<br \/>\n  display: flex;<br \/>\n  justify-content: center;<br \/>\n  align-items: center;<br \/>\n  padding: 2rem;<br \/>\n  box-sizing: border-box;<br \/>\n}<\/p>\n<p>.hero {<br \/>\n  flex-direction: column;<br \/>\n  background: linear-gradient(135deg, #1a2a6c, #b21f1f, #1a2a6c);<br \/>\n  color: white;<br \/>\n  text-align: center;<br \/>\n  position: relative;<br \/>\n}<\/p>\n<p>.hero-title {<br \/>\n  font-size: 4rem;<br \/>\n  margin-bottom: 2rem;<br \/>\n  text-shadow: 0 2px 10px rgba(0,0,0,0.3);<br \/>\n}<\/p>\n<p>.scroller-hint {<br \/>\n  position: absolute;<br \/>\n  bottom: 5rem;<br \/>\n  animation: pulse 2s infinite;<br \/>\n  opacity: 0.8;<br \/>\n}<\/p>\n<p>&#064;keyframes pulse {<br \/>\n  0% { transform: translateY(0); opacity: 0.6; }<br \/>\n  50% { transform: translateY(-10px); opacity: 1; }<br \/>\n  100% { transform: translateY(0); opacity: 0.6; }<br \/>\n}<\/p>\n<p>.features {<br \/>\n  display: flex;<br \/>\n  justify-content: space-around;<br \/>\n  flex-wrap: wrap;<br \/>\n  background: #f8f9fa;<br \/>\n  gap: 2rem;<br \/>\n}<\/p>\n<p>.feature-box {<br \/>\n  background: white;<br \/>\n  border-radius: 16px;<br \/>\n  box-shadow: 0 10px 30px rgba(0,0,0,0.1);<br \/>\n  padding: 2rem;<br \/>\n  max-width: 320px;<br \/>\n  text-align: center;<br \/>\n  transform: translateY(50px);<br \/>\n  opacity: 0;<br \/>\n}<\/p>\n<p>.feature-icon {<br \/>\n  font-size: 3rem;<br \/>\n  margin-bottom: 1rem;<br \/>\n}<\/p>\n<p>.demo {<br \/>\n  flex-direction: column;<br \/>\n  background: #0f172a;<br \/>\n  color: white;<br \/>\n}<\/p>\n<p>.demo-header {<br \/>\n  text-align: center;<br \/>\n  margin-bottom: 2rem;<br \/>\n  width: 100%;<br \/>\n  max-width: 800px;<br \/>\n}<\/p>\n<p>.progress-indicator {<br \/>\n  height: 6px;<br \/>\n  background: rgba(255,255,255,0.1);<br \/>\n  border-radius: 3px;<br \/>\n  margin-top: 1rem;<br \/>\n  overflow: hidden;<br \/>\n}<\/p>\n<p>.progress-bar {<br \/>\n  height: 100%;<br \/>\n  width: 0;<br \/>\n  background: #4a6cf7;<br \/>\n  border-radius: 3px;<br \/>\n}<\/p>\n<p>canvas {<br \/>\n  background: #1e293b;<br \/>\n  border-radius: 12px;<br \/>\n  box-shadow: 0 20px 50px rgba(0,0,0,0.3);<br \/>\n  max-width: 100%;<br \/>\n}<br \/>\n&lt;\/style&gt;<\/p>\n<h3>\u590d\u6742\u52a8\u753b\u5e8f\u5217\u7ba1\u7406<\/h3>\n<p><span class=\"token comment\">\/\/ animation-manager.js<\/span><br \/>\n<span class=\"token keyword\">import<\/span> gsap <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#039;gsap&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> router <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#039;&#064;\/router&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">export<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">AnimationDirector<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">constructor<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>timelines <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>currentScene <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>resourceCache <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">createScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">name<span class=\"token punctuation\">,<\/span> config <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> tl <span class=\"token operator\">&#061;<\/span> gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">timeline<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token literal-property property\">paused<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">defaults<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">duration<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">ease<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;power3.out&#034;<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token operator\">&#8230;<\/span>config<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>timelines<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">,<\/span> tl<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> tl<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token keyword\">async<\/span> <span class=\"token function\">playScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">name<span class=\"token punctuation\">,<\/span> options <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6e05\u7406\u5f53\u524d\u573a\u666f<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>currentScene<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>currentScene<span class=\"token punctuation\">.<\/span><span class=\"token function\">pause<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">killTweensOf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>currentScene<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> scene <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>timelines<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>scene<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      console<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">Scene <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>name<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\"> not found<\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8d44\u6e90\u9884\u52a0\u8f7d<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>options<span class=\"token punctuation\">.<\/span>preload<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token keyword\">await<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">preloadAssets<\/span><span class=\"token punctuation\">(<\/span>options<span class=\"token punctuation\">.<\/span>preload<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u64ad\u653e\u65b0\u573a\u666f<\/span><br \/>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>currentScene <span class=\"token operator\">&#061;<\/span> scene<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>options<span class=\"token punctuation\">.<\/span>resetOnPlay<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      scene<span class=\"token punctuation\">.<\/span><span class=\"token function\">progress<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    scene<span class=\"token punctuation\">.<\/span><span class=\"token function\">play<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u540c\u6b65\u9875\u9762\u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>options<span class=\"token punctuation\">.<\/span>updateRoute<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      router<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> options<span class=\"token punctuation\">.<\/span>routeName <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> scene<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u9ad8\u7ea7\u8d44\u6e90\u9884\u52a0\u8f7d<\/span><br \/>\n  <span class=\"token keyword\">async<\/span> <span class=\"token function\">preloadAssets<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">assets<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> promises <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    assets<span class=\"token punctuation\">.<\/span><span class=\"token function\">forEach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">asset<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token comment\">\/\/ \u68c0\u67e5\u7f13\u5b58<\/span><br \/>\n      <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>resourceCache<span class=\"token punctuation\">.<\/span><span class=\"token function\">has<\/span><span class=\"token punctuation\">(<\/span>asset<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><\/p>\n<p>      <span class=\"token keyword\">const<\/span> promise <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">resolve<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>asset<span class=\"token punctuation\">.<\/span>type<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n          <span class=\"token keyword\">case<\/span> <span class=\"token string\">&#039;image&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> img <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Image<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            img<span class=\"token punctuation\">.<\/span><span class=\"token function-variable function\">onload<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n              <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>resourceCache<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span>asset<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">,<\/span> img<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n              <span class=\"token function\">resolve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            img<span class=\"token punctuation\">.<\/span>src <span class=\"token operator\">&#061;<\/span> asset<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>          <span class=\"token keyword\">case<\/span> <span class=\"token string\">&#039;video&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> video <span class=\"token operator\">&#061;<\/span> document<span class=\"token punctuation\">.<\/span><span class=\"token function\">createElement<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;video&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            video<span class=\"token punctuation\">.<\/span>preload <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;metadata&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            video<span class=\"token punctuation\">.<\/span><span class=\"token function-variable function\">onloadedmetadata<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n              <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>resourceCache<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span>asset<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">,<\/span> video<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n              <span class=\"token function\">resolve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            video<span class=\"token punctuation\">.<\/span>src <span class=\"token operator\">&#061;<\/span> asset<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>          <span class=\"token keyword\">case<\/span> <span class=\"token string\">&#039;font&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            document<span class=\"token punctuation\">.<\/span>fonts<span class=\"token punctuation\">.<\/span><span class=\"token function\">load<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">12px &#034;<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>asset<span class=\"token punctuation\">.<\/span>name<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n              <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>resourceCache<span class=\"token punctuation\">.<\/span><span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span>asset<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n              <span class=\"token function\">resolve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>      promises<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>promise<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> Promise<span class=\"token punctuation\">.<\/span><span class=\"token function\">all<\/span><span class=\"token punctuation\">(<\/span>promises<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u52a8\u753b\u5e8f\u5217\u6784\u5efa\u5668&#xff08;\u652f\u6301\u590d\u6742\u7f16\u6392&#xff09;<\/span><br \/>\n  <span class=\"token function\">buildAnimationSequence<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">elements<span class=\"token punctuation\">,<\/span> config <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> sequence <span class=\"token operator\">&#061;<\/span> gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">timeline<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token literal-property property\">defaults<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">duration<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">stagger<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.15<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token operator\">&#8230;<\/span>config<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u591a\u5143\u7d20\u52a8\u753b\u7f16\u6392<\/span><br \/>\n    elements<span class=\"token punctuation\">.<\/span><span class=\"token function\">forEach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">element<span class=\"token punctuation\">,<\/span> index<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token keyword\">const<\/span> position <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">.<\/span>stagger <span class=\"token operator\">?<\/span> index <span class=\"token operator\">*<\/span> config<span class=\"token punctuation\">.<\/span>stagger <span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;&lt;0.1&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>      sequence<span class=\"token punctuation\">.<\/span><span class=\"token function\">to<\/span><span class=\"token punctuation\">(<\/span>element<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token operator\">&#8230;<\/span>config<span class=\"token punctuation\">.<\/span>elementAnimations<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">x<\/span><span class=\"token operator\">:<\/span> config<span class=\"token punctuation\">.<\/span>direction <span class=\"token operator\">&#061;&#061;&#061;<\/span> <span class=\"token string\">&#039;rtl&#039;<\/span> <span class=\"token operator\">?<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">100<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">delay<\/span><span class=\"token operator\">:<\/span> config<span class=\"token punctuation\">.<\/span>delay <span class=\"token operator\">?<\/span> config<span class=\"token punctuation\">.<\/span>delay <span class=\"token operator\">*<\/span> index <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> position<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u56de\u8c03<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>config<span class=\"token punctuation\">.<\/span>onStart<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      sequence<span class=\"token punctuation\">.<\/span><span class=\"token function\">eventCallback<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;onStart&#034;<\/span><span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">.<\/span>onStart<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>config<span class=\"token punctuation\">.<\/span>onComplete<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      sequence<span class=\"token punctuation\">.<\/span><span class=\"token function\">eventCallback<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;onComplete&#034;<\/span><span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">.<\/span>onComplete<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> sequence<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u521b\u5efa\u4ea4\u9519\u52a8\u753b\u6548\u679c<\/span><br \/>\n  <span class=\"token function\">createStaggerEffect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">targets<span class=\"token punctuation\">,<\/span> vars<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">from<\/span><span class=\"token punctuation\">(<\/span>targets<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">duration<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">stagger<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">each<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.15<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">from<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;random&#034;<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">ease<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;back.out(1.2)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token operator\">&#8230;<\/span>vars<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Vue\u96c6\u6210<\/span><br \/>\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">useAnimation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">const<\/span> director <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">inject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;animationDirector&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">animate<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">target<span class=\"token punctuation\">,<\/span> options<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">to<\/span><span class=\"token punctuation\">(<\/span>target<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token literal-property property\">duration<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token literal-property property\">ease<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;power3.out&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token operator\">&#8230;<\/span>options<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u521b\u5efa\u6eda\u52a8\u89e6\u53d1\u52a8\u753b<\/span><br \/>\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">scrollAnimation<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">target<span class=\"token punctuation\">,<\/span> trigger<span class=\"token punctuation\">,<\/span> vars<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> gsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">to<\/span><span class=\"token punctuation\">(<\/span>target<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token literal-property property\">scrollTrigger<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">trigger<\/span><span class=\"token operator\">:<\/span> trigger <span class=\"token operator\">||<\/span> target<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">start<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;top 80%&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">end<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;bottom 20%&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">scrub<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">markers<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token operator\">&#8230;<\/span>vars<span class=\"token operator\">?.<\/span>scrollTrigger<br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n      <span class=\"token operator\">&#8230;<\/span>vars<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    director<span class=\"token punctuation\">,<\/span><br \/>\n    animate<span class=\"token punctuation\">,<\/span><br \/>\n    scrollAnimation<br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Vue\u63d2\u4ef6\u5b89\u88c5<\/span><br \/>\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">const<\/span> AnimationPlugin <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">install<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">app<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> director <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">AnimationDirector<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    app<span class=\"token punctuation\">.<\/span><span class=\"token function\">provide<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;animationDirector&#039;<\/span><span class=\"token punctuation\">,<\/span> director<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    app<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">.<\/span>globalProperties<span class=\"token punctuation\">.<\/span>$animator <span class=\"token operator\">&#061;<\/span> director<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>\u5e94\u7528\u793a\u4f8b<\/h4>\n<p><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">!<\/span><span class=\"token operator\">&#8212;<\/span> \u5728Vue\u7ec4\u4ef6\u4e2d\u4f7f\u7528 <span class=\"token operator\">&#8212;<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span>script<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useAnimation <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#039;&#064;\/animation-manager&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">setup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> director<span class=\"token punctuation\">,<\/span> animate<span class=\"token punctuation\">,<\/span> scrollAnimation <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">useAnimation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> sectionRef <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> cards <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">onMounted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token comment\">\/\/ \u521b\u5efa\u52a8\u753b\u573a\u666f<\/span><br \/>\n      <span class=\"token keyword\">const<\/span> introScene <span class=\"token operator\">&#061;<\/span> director<span class=\"token punctuation\">.<\/span><span class=\"token function\">createScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;intro&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>      introScene<br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">from<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;.hero-title&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">from<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;.subtitle&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;-&#061;0.3&#039;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>director<span class=\"token punctuation\">.<\/span><span class=\"token function\">createStaggerEffect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;.features&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">30<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>      <span class=\"token comment\">\/\/ \u64ad\u653e\u573a\u666f<\/span><br \/>\n      director<span class=\"token punctuation\">.<\/span><span class=\"token function\">playScene<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;intro&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">preload<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n          <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;image&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">url<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;\/images\/hero-bg.jpg&#039;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n          <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">type<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;font&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;Montserrat&#039;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>      <span class=\"token comment\">\/\/ \u6eda\u52a8\u52a8\u753b<\/span><br \/>\n      <span class=\"token function\">scrollAnimation<\/span><span class=\"token punctuation\">(<\/span>sectionRef<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token literal-property property\">y<\/span><span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">opacity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token literal-property property\">scrollTrigger<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">scrub<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0.7<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span> sectionRef<span class=\"token punctuation\">,<\/span> cards <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>script<span class=\"token operator\">&gt;<\/span><\/p>\n<h4>\u5173\u952e\u4f18\u5316\u8bf4\u660e<\/h4>\n<p>1.\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u589e\u5f3a&#xff1a;<\/p>\n<ul>\n<li>\u6dfb\u52a0\u4e86Canvas\u52a8\u6001\u53ef\u89c6\u5316\u6548\u679c&#xff0c;\u54cd\u5e94\u6eda\u52a8\u4f4d\u7f6e<\/li>\n<li>\u5b9e\u73b0\u6027\u80fd\u4f18\u5316\u7684\u6e32\u67d3\u5faa\u73af&#xff08;requestAnimationFrame&#xff09;<\/li>\n<li>\u6dfb\u52a0\u8fdb\u5ea6\u6307\u793a\u5668\u548c\u89c6\u89c9\u53cd\u9988\u5143\u7d20<\/li>\n<li>\u5b8c\u5584\u4e86\u54cd\u5e94\u5f0f\u8bbe\u8ba1\u548c\u79fb\u52a8\u7aef\u9002\u914d<\/li>\n<\/ul>\n<p>2.\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u589e\u5f3a&#xff1a;<\/p>\n<ul>\n<li>\u652f\u6301\u8d44\u6e90\u9884\u52a0\u8f7d&#xff08;\u56fe\u7247\/\u89c6\u9891\/\u5b57\u4f53&#xff09;<\/li>\n<li>\u6dfb\u52a0\u4ea4\u9519\u52a8\u753b(stagger)\u548c\u968f\u673a\u6548\u679c<\/li>\n<li>\u65f6\u95f4\u7ebf\u56de\u8c03\u4e8b\u4ef6\u7cfb\u7edf<\/li>\n<li>\u52a8\u753b\u573a\u666f\u72b6\u6001\u7ba1\u7406<\/li>\n<li>\u5185\u5b58\u8d44\u6e90\u7f13\u5b58\u4f18\u5316<\/li>\n<\/ul>\n<p>3.Vue\u6df1\u5ea6\u96c6\u6210&#xff1a;<\/p>\n<ul>\n<li>\u63d0\u4f9b\u7ec4\u5408\u5f0fAPI\u94a9\u5b50(useAnimation)<\/li>\n<li>\u5f00\u53d1Vue\u63d2\u4ef6\u5b89\u88c5\u7cfb\u7edf<\/li>\n<li>\u5168\u5c40\u52a8\u753b\u63a7\u5236\u5668\u6ce8\u5165<\/li>\n<li>\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u81ea\u52a8\u6e05\u7406<\/li>\n<\/ul>\n<p>4.\u6027\u80fd\u4f18\u5316&#xff1a;<\/p>\n<ul>\n<li>\u6eda\u52a8\u76d1\u542c\u8282\u6d41\u5904\u7406<\/li>\n<li>\u52a8\u753b\u5bf9\u8c61\u56de\u6536\u673a\u5236<\/li>\n<li>Canvas\u6e32\u67d3\u5e27\u7387\u63a7\u5236<\/li>\n<li>\u8d44\u6e90\u7f13\u5b58\u4e0e\u590d\u7528<\/li>\n<\/ul>\n<p>5.\u89c6\u89c9\u589e\u5f3a&#xff1a;<\/p>\n<ul>\n<li>\u5e73\u6ed1\u76843D\u53d8\u6362\u6548\u679c<\/li>\n<li>\u52a8\u6001\u989c\u8272\u8fc7\u6e21<\/li>\n<li>\u7269\u7406\u611f\u52a8\u753b\u66f2\u7ebf<\/li>\n<li>\u4ea4\u4e92\u52a8\u753b\u53cd\u9988<\/li>\n<\/ul>\n<hr \/>\n<h2>\u56db\u3001\u6027\u80fd\u4f18\u5316\u5bf9\u6bd4\u8868<\/h2>\n<table>\n<tr>\u6280\u672f\u57fa\u7840\u5b9e\u73b0\u4f18\u5316\u5b9e\u73b0\u6027\u80fd\u63d0\u5347<\/tr>\n<tbody>\n<tr>\n<td>Canvas\u6e32\u67d3<\/td>\n<td>\u5168\u91cf\u91cd\u7ed8<\/td>\n<td>\u810f\u77e9\u5f62\u6e32\u67d3<\/td>\n<td>300% \u2191<\/td>\n<\/tr>\n<tr>\n<td>WebGL\u573a\u666f<\/td>\n<td>60fps<\/td>\n<td>90fps&#043;<\/td>\n<td>50% \u2191<\/td>\n<\/tr>\n<tr>\n<td>\u6eda\u52a8\u52a8\u753b<\/td>\n<td>\u76f4\u63a5\u4e8b\u4ef6\u76d1\u542c<\/td>\n<td>ScrollTrigger<\/td>\n<td>70% \u2191<\/td>\n<\/tr>\n<tr>\n<td>\u52a8\u753b\u5e8f\u5217<\/td>\n<td>\u72ec\u7acb\u52a8\u753b<\/td>\n<td>\u65f6\u95f4\u8f74\u63a7\u5236<\/td>\n<td>40% \u2191<\/td>\n<\/tr>\n<tr>\n<td>\u8d44\u6e90\u52a0\u8f7d<\/td>\n<td>\u540c\u6b65\u52a0\u8f7d<\/td>\n<td>\u9884\u52a0\u8f7d&#043;\u61d2\u52a0\u8f7d<\/td>\n<td>200% \u2191<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>\u4e94\u3001 \u4e13\u5bb6\u7ea7\u6280\u5de7<\/h2>\n<li>\n<p>\u6df7\u5408\u6e32\u67d3\u7b56\u7565<\/p>\n<p> <span class=\"token comment\">\/\/ \u7ec4\u5408Canvas&#043;WebGL&#043;DOM<\/span><br \/>\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">hybridRender<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token comment\">\/\/ \u9759\u6001\u80cc\u666f&#xff1a;Canvas 2D<\/span><br \/>\n  <span class=\"token function\">renderStaticBackground<\/span><span class=\"token punctuation\">(<\/span>canvas2d<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4ea4\u4e92\u5143\u7d20&#xff1a;DOM<\/span><br \/>\n  <span class=\"token function\">renderUIElements<\/span><span class=\"token punctuation\">(<\/span>domLayer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4e09\u7ef4\u6548\u679c&#xff1a;WebGL<\/span><br \/>\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">shouldRender3D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">renderWebGLScene<\/span><span class=\"token punctuation\">(<\/span>webglCanvas<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>\n <\/li>\n<li>\n<p>\u52a8\u753b\u7269\u7406\u5f15\u64ce\u96c6\u6210<\/p>\n<p> <span class=\"token comment\">\/\/ \u4f7f\u7528GSAP PhysicsPlugin<\/span><br \/>\ngsap<span class=\"token punctuation\">.<\/span><span class=\"token function\">to<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.ball&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token literal-property property\">duration<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">physics2D<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token literal-property property\">velocity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">250<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token literal-property property\">angle<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">45<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token literal-property property\">gravity<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">500<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <\/li>\n<li>\n<p>GPU\u52a0\u901fCSS\u53d8\u91cf<\/p>\n<p> <span class=\"token selector\">.animated-element<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token property\">transform<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token function\">translate3d<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">var<\/span><span class=\"token punctuation\">(<\/span>&#8211;tx<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">var<\/span><span class=\"token punctuation\">(<\/span>&#8211;ty<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token function\">rotate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">var<\/span><span class=\"token punctuation\">(<\/span>&#8211;rotate<span class=\"token punctuation\">,<\/span> 0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token property\">transition<\/span><span class=\"token punctuation\">:<\/span> transform 0.3s linear<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u901a\u8fc7JS\u66f4\u65b0 *\/<\/span><br \/>\n<span class=\"token selector\">element.style.setProperty(&#039;&#8211;tx&#039;, &#096;$<\/span><span class=\"token punctuation\">{<\/span>x<span class=\"token punctuation\">}<\/span>px&#096;<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <\/li>\n<li>\n<p>\u52a8\u753b\u6027\u80fd\u76d1\u63a7<\/p>\n<p> <span class=\"token comment\">\/\/ \u5e27\u7387\u76d1\u63a7<\/span><br \/>\n<span class=\"token keyword\">const<\/span> perf <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token literal-property property\">frameCount<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">lastTime<\/span><span class=\"token operator\">:<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">function<\/span> <span class=\"token function\">monitorAnimation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">requestAnimationFrame<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    perf<span class=\"token punctuation\">.<\/span>frameCount<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> now <span class=\"token operator\">&#061;<\/span> performance<span class=\"token punctuation\">.<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> delta <span class=\"token operator\">&#061;<\/span> now <span class=\"token operator\">&#8211;<\/span> perf<span class=\"token punctuation\">.<\/span>lastTime<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>delta <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n      <span class=\"token keyword\">const<\/span> fps <span class=\"token operator\">&#061;<\/span> Math<span class=\"token punctuation\">.<\/span><span class=\"token function\">round<\/span><span class=\"token punctuation\">(<\/span>perf<span class=\"token punctuation\">.<\/span>frameCount <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span> <span class=\"token operator\">\/<\/span> delta<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">FPS: <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>fps<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      perf<span class=\"token punctuation\">.<\/span>frameCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n      perf<span class=\"token punctuation\">.<\/span>lastTime <span class=\"token operator\">&#061;<\/span> now<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">monitorAnimation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>\n <\/li>\n<hr \/>\n<h4>\u7ed3\u8bed<\/h4>\n<p>Vue\u5e94\u7528\u4e2d\u7684\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\u6280\u672f\u5df2\u8fdb\u5165\u4e13\u4e1a\u7ea7\u65f6\u4ee3&#xff1a;<\/p>\n<li>Canvas\u4f53\u7cfb&#xff1a;Konva.js\u63d0\u4f9b\u58f0\u660e\u5f0fAPI&#xff0c;\u7ed3\u5408\u865a\u62df\u5316\u6e32\u67d3\u6280\u672f\u53ef\u5904\u740610,000&#043;\u8282\u70b9\u6d41\u7a0b\u56fe<\/li>\n<li>\u4e09\u7ef4\u53ef\u89c6\u5316&#xff1a;vue-threejs\u8ba9WebGL\u5f00\u53d1\u66f4\u7b26\u5408Vue\u601d\u7ef4&#xff0c;\u652f\u6301\u54cd\u5e94\u5f0f\u72b6\u6001\u9a71\u52a8\u573a\u666f<\/li>\n<li>\u52a8\u753b\u5de5\u7a0b\u5316&#xff1a;GSAP\u65f6\u95f4\u8f74\u7ba1\u7406\u7cfb\u7edf\u4f7f\u590d\u6742\u52a8\u753b\u5e8f\u5217\u53ef\u7ef4\u62a4\u3001\u53ef\u8c03\u8bd5<\/li>\n<li>\u6027\u80fd\u65b0\u6807\u51c6&#xff1a;\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u5c06\u5e27\u7387\u4ece60fps\u63d0\u5347\u81f390fps&#043;\u7684\u6d41\u7545\u4f53\u9a8c<\/li>\n<p>\u5f53\u8fd9\u4e9b\u6280\u672f\u534f\u540c\u5de5\u4f5c&#xff0c;\u5982\u901a\u8fc7Canvas\u5904\u74062D UI\u3001WebGL\u6e32\u67d3\u4e09\u7ef4\u7279\u6548\u3001GSAP\u9a71\u52a8\u52a8\u753b\u5e8f\u5217&#xff0c;\u5f00\u53d1\u8005\u80fd\u5728Vue\u5e94\u7528\u4e2d\u6784\u5efa\u5ab2\u7f8e\u539f\u751f\u4f53\u9a8c\u7684\u89c6\u89c9\u76db\u5bb4\u3002\u672a\u6765\u968f\u7740WebGPU\u7684\u666e\u53ca&#xff0c;Vue\u5e94\u7528\u7684\u89c6\u89c9\u8868\u73b0\u529b\u5c06\u7a81\u7834\u6d4f\u89c8\u5668\u9650\u5236&#xff0c;\u5f00\u542f\u5168\u65b0\u7684\u6c89\u6d78\u5f0f\u4f53\u9a8c\u65f6\u4ee3\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb686\u6b21\uff0c\u70b9\u8d5e7\u6b21\uff0c\u6536\u85cf30\u6b21\u3002\u6027\u80fd\u4f18\u5316\u6280\u5de7\uff1a\u4e0b\u9762\u662f\u5b8c\u6574\u7684\u5b9e\u73b0\u65b9\u6848\uff1a02\u3001\u5173\u952e\u6027\u80fd\u4f18\u5316\u5b9e\u73b0\u5206\u5c42\u6e32\u67d3\uff1a\u6279\u91cf\u66f4\u65b0\uff1a\u865a\u62df\u5316\u6e32\u67d3\uff1a\u7f13\u5b58\u7b56\u7565\uff1aGPU\u52a0\u901f\uff1a\u4e09\u7ef4\u7f16\u8f91\u573a\u666f\u7ec4\u4ef6\uff1aWebGL\u4f18\u5316\u7b56\u7565\uff1a\u4e0b\u65b9\u4e3a\u5b8c\u6574WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668\u5173\u952e\u7279\u6027\u4e0e\u4f18\u5316\u7b56\u7565\u5b9e\u73b01.WebGL\u4e09\u7ef4\u573a\u666f\u6838\u5fc3\u529f\u80fd2.\u6700\u4f73\u5b9e\u8df5\u5b9e\u73b03.WebGL\u4f18\u5316\u7b56\u75654.\u7528\u6237\u754c\u9762\u4eae\u70b95.\u4f7f\u7528\u8bf4\u660e\u590d\u6742\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u5e94\u7528\u793a\u4f8b\u5173\u952e\u4f18\u5316\u8bf4\u660e1.\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u589e\u5f3a\uff1a2.\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u589e\u5f3a\uff1a3.Vue\u6df1\u5ea6\u96c6\u6210\uff1a4.\u6027\u80fd\u4f18\u5316\uff1a5.\u89c6\u89c9\u589e\u5f3a\uff1a\u6df7\u5408\u6e32\u67d3\u7b56\u7565\u52a8\u753b\u7269\u7406\u5f15\u64ce\u96c6\u6210GPU\u52a0\u901fCS_vue3 \u6570\u636e\u53ef\u89c6\u5316 \u5f15\u5165 svg \u5b9e\u73b0 \u6a21\u5757 \u5f02\u5f62 \u8fb9\u6846<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[187,625,87,3823],"topic":[],"class_list":["post-41581","post","type-post","status-publish","format-standard","hentry","category-server","tag-javascript","tag-vue-js","tag-87","tag-3823"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/41581.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb686\u6b21\uff0c\u70b9\u8d5e7\u6b21\uff0c\u6536\u85cf30\u6b21\u3002\u6027\u80fd\u4f18\u5316\u6280\u5de7\uff1a\u4e0b\u9762\u662f\u5b8c\u6574\u7684\u5b9e\u73b0\u65b9\u6848\uff1a02\u3001\u5173\u952e\u6027\u80fd\u4f18\u5316\u5b9e\u73b0\u5206\u5c42\u6e32\u67d3\uff1a\u6279\u91cf\u66f4\u65b0\uff1a\u865a\u62df\u5316\u6e32\u67d3\uff1a\u7f13\u5b58\u7b56\u7565\uff1aGPU\u52a0\u901f\uff1a\u4e09\u7ef4\u7f16\u8f91\u573a\u666f\u7ec4\u4ef6\uff1aWebGL\u4f18\u5316\u7b56\u7565\uff1a\u4e0b\u65b9\u4e3a\u5b8c\u6574WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668\u5173\u952e\u7279\u6027\u4e0e\u4f18\u5316\u7b56\u7565\u5b9e\u73b01.WebGL\u4e09\u7ef4\u573a\u666f\u6838\u5fc3\u529f\u80fd2.\u6700\u4f73\u5b9e\u8df5\u5b9e\u73b03.WebGL\u4f18\u5316\u7b56\u75654.\u7528\u6237\u754c\u9762\u4eae\u70b95.\u4f7f\u7528\u8bf4\u660e\u590d\u6742\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u5e94\u7528\u793a\u4f8b\u5173\u952e\u4f18\u5316\u8bf4\u660e1.\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u589e\u5f3a\uff1a2.\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u589e\u5f3a\uff1a3.Vue\u6df1\u5ea6\u96c6\u6210\uff1a4.\u6027\u80fd\u4f18\u5316\uff1a5.\u89c6\u89c9\u589e\u5f3a\uff1a\u6df7\u5408\u6e32\u67d3\u7b56\u7565\u52a8\u753b\u7269\u7406\u5f15\u64ce\u96c6\u6210GPU\u52a0\u901fCS_vue3 \u6570\u636e\u53ef\u89c6\u5316 \u5f15\u5165 svg \u5b9e\u73b0 \u6a21\u5757 \u5f02\u5f62 \u8fb9\u6846\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/41581.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-03T15:27:21+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/41581.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/41581.html\",\"name\":\"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-06-03T15:27:21+00:00\",\"dateModified\":\"2025-06-03T15:27:21+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/41581.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/41581.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/41581.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/41581.html","og_locale":"zh_CN","og_type":"article","og_title":"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb686\u6b21\uff0c\u70b9\u8d5e7\u6b21\uff0c\u6536\u85cf30\u6b21\u3002\u6027\u80fd\u4f18\u5316\u6280\u5de7\uff1a\u4e0b\u9762\u662f\u5b8c\u6574\u7684\u5b9e\u73b0\u65b9\u6848\uff1a02\u3001\u5173\u952e\u6027\u80fd\u4f18\u5316\u5b9e\u73b0\u5206\u5c42\u6e32\u67d3\uff1a\u6279\u91cf\u66f4\u65b0\uff1a\u865a\u62df\u5316\u6e32\u67d3\uff1a\u7f13\u5b58\u7b56\u7565\uff1aGPU\u52a0\u901f\uff1a\u4e09\u7ef4\u7f16\u8f91\u573a\u666f\u7ec4\u4ef6\uff1aWebGL\u4f18\u5316\u7b56\u7565\uff1a\u4e0b\u65b9\u4e3a\u5b8c\u6574WebGL\u4e09\u7ef4\u89c6\u9891\u7f16\u8f91\u5668\u5173\u952e\u7279\u6027\u4e0e\u4f18\u5316\u7b56\u7565\u5b9e\u73b01.WebGL\u4e09\u7ef4\u573a\u666f\u6838\u5fc3\u529f\u80fd2.\u6700\u4f73\u5b9e\u8df5\u5b9e\u73b03.WebGL\u4f18\u5316\u7b56\u75654.\u7528\u6237\u754c\u9762\u4eae\u70b95.\u4f7f\u7528\u8bf4\u660e\u590d\u6742\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u5e94\u7528\u793a\u4f8b\u5173\u952e\u4f18\u5316\u8bf4\u660e1.\u6eda\u52a8\u9a71\u52a8\u52a8\u753b\u589e\u5f3a\uff1a2.\u52a8\u753b\u5e8f\u5217\u7ba1\u7406\u589e\u5f3a\uff1a3.Vue\u6df1\u5ea6\u96c6\u6210\uff1a4.\u6027\u80fd\u4f18\u5316\uff1a5.\u89c6\u89c9\u589e\u5f3a\uff1a\u6df7\u5408\u6e32\u67d3\u7b56\u7565\u52a8\u753b\u7269\u7406\u5f15\u64ce\u96c6\u6210GPU\u52a0\u901fCS_vue3 \u6570\u636e\u53ef\u89c6\u5316 \u5f15\u5165 svg \u5b9e\u73b0 \u6a21\u5757 \u5f02\u5f62 \u8fb9\u6846","og_url":"https:\/\/www.wsisp.com\/helps\/41581.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-06-03T15:27:21+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"35 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/41581.html","url":"https:\/\/www.wsisp.com\/helps\/41581.html","name":"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-06-03T15:27:21+00:00","dateModified":"2025-06-03T15:27:21+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/41581.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/41581.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/41581.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u53ef\u89c6\u5316\u4e0e\u52a8\u753b\uff1a\u6784\u5efa\u6c89\u6d78\u5f0fVue\u5e94\u7528\u7684\u8fdb\u9636\u5b9e\u8df5"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/41581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=41581"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/41581\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=41581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=41581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=41581"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=41581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}