mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-23 01:07:12 +08:00
fix #14433 #### PR Dependency Tree * **PR #14442** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Level-of-detail thumbnails for large images. * Adaptive pacing for snapping, distribution and other alignment work. * RAF coalescer utility to batch high-frequency updates. * Operation timing utility to measure synchronous work. * **Improvements** * Batch group/ungroup reparenting that preserves element order and selection. * Coalesced panning and drag updates to reduce jitter. * Connector/group indexing for more reliable updates, deletions and sync. * Throttled viewport refresh behavior. * **Documentation** * Docs added for RAF coalescer and measureOperation. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
66 lines
1.2 KiB
TypeScript
66 lines
1.2 KiB
TypeScript
export class AdaptiveStrideController {
|
|
private _stride = 1;
|
|
|
|
private _ticks = 0;
|
|
|
|
constructor(
|
|
private readonly _options: {
|
|
heavyCostMs: number;
|
|
maxStride: number;
|
|
recoveryCostMs: number;
|
|
}
|
|
) {}
|
|
|
|
reportCost(costMs: number) {
|
|
if (costMs > this._options.heavyCostMs) {
|
|
this._stride = Math.min(this._options.maxStride, this._stride + 1);
|
|
return;
|
|
}
|
|
|
|
if (costMs < this._options.recoveryCostMs && this._stride > 1) {
|
|
this._stride -= 1;
|
|
}
|
|
}
|
|
|
|
reset() {
|
|
this._stride = 1;
|
|
this._ticks = 0;
|
|
}
|
|
|
|
shouldSkip() {
|
|
const shouldSkip = this._stride > 1 && this._ticks % this._stride !== 0;
|
|
this._ticks += 1;
|
|
return shouldSkip;
|
|
}
|
|
}
|
|
|
|
export class AdaptiveCooldownController {
|
|
private _remainingFrames = 0;
|
|
|
|
constructor(
|
|
private readonly _options: {
|
|
cooldownFrames: number;
|
|
maxCostMs: number;
|
|
}
|
|
) {}
|
|
|
|
reportCost(costMs: number) {
|
|
if (costMs > this._options.maxCostMs) {
|
|
this._remainingFrames = this._options.cooldownFrames;
|
|
}
|
|
}
|
|
|
|
reset() {
|
|
this._remainingFrames = 0;
|
|
}
|
|
|
|
shouldRun() {
|
|
if (this._remainingFrames <= 0) {
|
|
return true;
|
|
}
|
|
|
|
this._remainingFrames -= 1;
|
|
return false;
|
|
}
|
|
}
|