| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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 { read, resolveKeyframes, update, preRender, render, postRender } = steps;
- const processBatch = () => {
- const timestamp = MotionGlobalConfig.useManualTiming
- ? state.timestamp
- : performance.now();
- runNextFrame = false;
- if (!MotionGlobalConfig.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
- read.process(state);
- resolveKeyframes.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 };
|