three-base 2.0.145 → 2.0.168

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/threeUtils.ts CHANGED
@@ -50,11 +50,46 @@ class ThreeUtils extends EventDispatcher<ThreeUtilsEventTypeMap> {
50
50
  //执行一个计划任务
51
51
  let work = this.workList.splice(0, 1)[0];
52
52
  work && work();
53
+ // ⭐ 2026-10-09 皇上旨「整条 rAF 链只走 threeUtils 一条」:先结算本帧挂起的「等下一帧」,
54
+ // 再排下一拍 ⇒ 与 dispatchEvent 同拍派发,语义 =「下一帧的此刻」,与原生 rAF 同口径。
55
+ // ⚠️ 必须在 dispatchEvent **之后**结算:挂在事件上的 resolve 期望的就是下一帧,别在同一帧里被清掉。
56
+ this._flushNextFrameWaiters();
53
57
  setTimeout(() => {
54
58
  this.requestAnimationFrame();
55
59
  }, 30 - this._clock.getDelta());
56
60
  }
57
61
 
62
+ /**
63
+ * 等下一帧(**本库唯一的「等一帧」入口**,皇上 2026-10-09 旨)。
64
+ *
65
+ * ⛔ 为什么不再用原生 `await new Promise(r => requestAnimationFrame(r))`:
66
+ * 那是**独立于本类主循环的另一个 rAF 回调**,同一帧里与主循环并行跑 ⇒ 每帧多一次调度,
67
+ * 模型多时(如同时加载十几个 GLB,每个都 `awaitLoaded`)会积成每帧几十个回调 ⇒ 卡顿。
68
+ * 走本方法则**全部挂在本类这一条链上**(本类已把节流控到 30ms/帧),零额外调度。
69
+ *
70
+ * 典型用法(原三处`await new Promise(r => requestAnimationFrame(r))` 逐字替换即可):
71
+ * ```ts
72
+ * import threeUtils from "three-base/threeUtils";
73
+ * await threeUtils.waitNextFrame();
74
+ * ```
75
+ */
76
+ waitNextFrame(): Promise<void> {
77
+ return new Promise<void>((resolve) => {
78
+ this._nextFrameWaiters.push(resolve);
79
+ });
80
+ }
81
+
82
+ /** 结算所有 `waitNextFrame` 的挂起项(每帧由 `requestAnimationFrame` 调一次) */
83
+ private _nextFrameWaiters: Array<() => void> = [];
84
+
85
+ private _flushNextFrameWaiters(): void {
86
+ if (this._nextFrameWaiters.length === 0) return;
87
+ // 先摘出来再逐个调:回调里可能又挂新的(新挂的要等下一帧,不在本拍结算)
88
+ const waiters = this._nextFrameWaiters;
89
+ this._nextFrameWaiters = [];
90
+ for (const resolve of waiters) resolve();
91
+ }
92
+
58
93
  // 需要保持宽高比的元素列表
59
94
  private _keepZoomDoms: KeepZoomDom[] = [];
60
95