UNPKG

@turbox3d/shared

Version:

turbox shared internal utility

108 lines (107 loc) 3.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TaskPriority = void 0; exports.throttleInAFrame = throttleInAFrame; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _task = require("./task"); var _common = require("./common"); /** * 任务优先级。数据越小,优先级越高 */ var TaskPriority; (function (TaskPriority) { /** * 用户行为(比如:各种交互行为) */ TaskPriority[TaskPriority["UserAction"] = 0] = "UserAction"; /** * 更新领域数据 */ TaskPriority[TaskPriority["UpdateState"] = 1] = "UpdateState"; /** * 更新 React 组件 */ TaskPriority[TaskPriority["RenderReact"] = 2] = "RenderReact"; /** * 更新场景视图 * * 暂定高优先级,因为基于之后场景组件化的机制,这一帧绘制的应该是上一帧的结果 */ TaskPriority[TaskPriority["RenderScene"] = -1] = "RenderScene"; })(TaskPriority || (exports.TaskPriority = TaskPriority = {})); /** * TODO: * 1. 收集这里的任务排队执行情况 * 2. 根据搜集数据+行业中的任务切片方案来优化这边的任务执行 */ // 存储的任务队列 var tasks = []; // 是否注册了任务待执行 var readyToExecute = false; /** * 节流函数 */ function throttleByFrames(func, maxFPS) { var frameInterval = 1000 / maxFPS; // 计算每帧的时间间隔(毫秒) var lastTime = 0; return function () { var now = Date.now(); if (now - lastTime >= frameInterval) { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } func.apply(this, args); lastTime = now; } }; } /** * 执行任务队列 */ function executeTask() { // 得到排序后的当前任务队列 var currentTasks = (0, _common.sortBy)(tasks, function (task) { return task.priority; }); // 清空存储的数据 tasks = []; // 按顺序执行当前任务队列 currentTasks.forEach(function (task) { var fn = task.fn; fn(); }); readyToExecute = false; } /** * throttle 函数执行为每帧一次 * @param func 要执行的函数 * @param priority 优先级 */ function throttleInAFrame(func) { var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TaskPriority.UserAction; var maxFPS = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 60; var cacheArgs; var isPending = false; function execute() { isPending = false; func.apply(void 0, (0, _toConsumableArray2["default"])(cacheArgs)); } var f = throttleByFrames(function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } cacheArgs = args; if (!isPending) { isPending = true; tasks.push(_task.Task.createTask(execute, priority)); if (!readyToExecute) { readyToExecute = true; (0, _common.nextTick)(executeTask); } } }, maxFPS); return f; }