Files
2026-07-13 12:25:07 +08:00

60 lines
3.6 KiB
JavaScript

// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
// Installed into the page once via `page.addScriptTag`. Exposes:
// __BENCH_RESTORE__(config) - restore the viewer with `config`, drain RAFs,
// cache the active plugin and a fresh View.
// __BENCH_DRAW__() - drive one full plugin.draw(view) and return
// its wall-clock duration (ms).
//
// Important: `viewer.getView()` returns the *session-owned* View, not a clone.
// We never call `.delete()` on it — the viewer destroys it on the next
// `restore()`. See viewer.rs::getView docs.
(() => {
let _view = null;
let _plugin = null;
async function waitFrames(n) {
for (let i = 0; i < n; i++) {
await new Promise((r) => requestAnimationFrame(r));
}
}
window.__BENCH_RESTORE__ = async function (config) {
const viewer = document.querySelector("perspective-viewer");
await viewer.reset();
await viewer.restore(config);
// Drain the viewer's own scheduled render so the GL context is sized
// and warm before we start timing.
await viewer.flush();
await waitFrames(2);
_plugin = viewer.getPlugin();
_view = await viewer.getView();
};
window.__BENCH_DRAW__ = async function () {
if (!_plugin || !_view) {
throw new Error("__BENCH_DRAW__: call __BENCH_RESTORE__ first");
}
// `plugin.draw(view)` performs the full upload + GL submit. The
// returned promise resolves once `viewToColumnDataMap` has streamed
// every chunk through `_renderChunkData`. That is the unit we want.
const t0 = performance.now();
await _plugin.draw(_view);
const t1 = performance.now();
return t1 - t0;
};
})();