Blame view

天文台pc/tianwentai-ui/node_modules/motion-dom/dist/es/frameloop/batcher.mjs 2.48 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  import { MotionGlobalConfig } from 'motion-utils';
  import { stepsOrder } from './order.mjs';
  import { createRenderStep } from './render-step.mjs';
  
  const maxElapsed = 40;
  function createRenderBatcher(scheduleNextBatch, allowKeepAlive) {
      let runNextFrame = false;
      let useDefaultElapsed = true;
      const state = {
          delta: 0.0,
          timestamp: 0.0,
          isProcessing: false,
      };
      const flagRunNextFrame = () => (runNextFrame = true);
      const steps = stepsOrder.reduce((acc, key) => {
          acc[key] = createRenderStep(flagRunNextFrame, allowKeepAlive ? key : undefined);
          return acc;
      }, {});
      const { setup, read, resolveKeyframes, preUpdate, update, preRender, render, postRender, } = steps;
      const processBatch = () => {
          const useManualTiming = MotionGlobalConfig.useManualTiming;
          const timestamp = useManualTiming
              ? state.timestamp
              : performance.now();
          runNextFrame = false;
          if (!useManualTiming) {
              state.delta = useDefaultElapsed
                  ? 1000 / 60
                  : Math.max(Math.min(timestamp - state.timestamp, maxElapsed), 1);
          }
          state.timestamp = timestamp;
          state.isProcessing = true;
          // Unrolled render loop for better per-frame performance
          setup.process(state);
          read.process(state);
          resolveKeyframes.process(state);
          preUpdate.process(state);
          update.process(state);
          preRender.process(state);
          render.process(state);
          postRender.process(state);
          state.isProcessing = false;
          if (runNextFrame && allowKeepAlive) {
              useDefaultElapsed = false;
              scheduleNextBatch(processBatch);
          }
      };
      const wake = () => {
          runNextFrame = true;
          useDefaultElapsed = true;
          if (!state.isProcessing) {
              scheduleNextBatch(processBatch);
          }
      };
      const schedule = stepsOrder.reduce((acc, key) => {
          const step = steps[key];
          acc[key] = (process, keepAlive = false, immediate = false) => {
              if (!runNextFrame)
                  wake();
              return step.schedule(process, keepAlive, immediate);
          };
          return acc;
      }, {});
      const cancel = (process) => {
          for (let i = 0; i < stepsOrder.length; i++) {
              steps[stepsOrder[i]].cancel(process);
          }
      };
      return { schedule, cancel, state, steps };
  }
  
  export { createRenderBatcher };
  //# sourceMappingURL=batcher.mjs.map