three-blocks-benchmark 0.2.0-alpha.280.g945a5d860d58
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/CHANGELOG.md +86 -0
- package/LICENSE +75 -0
- package/NOTICE +11 -0
- package/README.md +65 -0
- package/bin/three-blocks-benchmark.mjs +90 -0
- package/browser/harness.js +632 -0
- package/browser/index.html +37 -0
- package/browser/scenes.js +221 -0
- package/lib/run.mjs +699 -0
- package/lib/standard.mjs +640 -0
- package/package.json +59 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# three-blocks-benchmark
|
|
2
|
+
|
|
3
|
+
## 0.2.0-alpha.280.g945a5d860d58
|
|
4
|
+
|
|
5
|
+
- CLI: New projects return to the shell and prefer Bun for the development command.
|
|
6
|
+
|
|
7
|
+
- Devtools: Development stays available when compatible shader receipts predate a version bump.
|
|
8
|
+
|
|
9
|
+
- Devtools: Headless shader checks ignore automatic favicon misses and allow slow screenshots.
|
|
10
|
+
|
|
11
|
+
- Library: Gaussian splats now promote still scenes to the fast tile compositor automatically.
|
|
12
|
+
|
|
13
|
+
- Library: Gaussian splats now stage tile-compositor promotion to avoid frame spikes.
|
|
14
|
+
|
|
15
|
+
- Library: Gaussian splats now use faster subgroup sorting when the GPU supports it.
|
|
16
|
+
|
|
17
|
+
- Packages: Benchmarks settle each frame lane before sampling steady-state performance.
|
|
18
|
+
|
|
19
|
+
- Packages: Benchmarks now compare GaussianSplats3D under the same standard protocol.
|
|
20
|
+
|
|
21
|
+
- Website: Agent docs and llms.txt match the shipped release and cover Baked Motion format 3.
|
|
22
|
+
|
|
23
|
+
- Website: Example search now connects every showcased feature to its matching library blocks.
|
|
24
|
+
|
|
25
|
+
- Packages: Built from `945a5d860d58`.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## 0.1.1
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- Updated dependencies [22be294]
|
|
33
|
+
- three-blocks@0.3.1
|
|
34
|
+
|
|
35
|
+
## 0.1.0
|
|
36
|
+
|
|
37
|
+
### Minor Changes
|
|
38
|
+
|
|
39
|
+
- 96be509: Packages: Splat benchmarks compare Three Blocks, Spark, and SuperSplat on canonical scenes.
|
|
40
|
+
- 8bd64d6: Standard suite: the Three Blocks viewer now runs the Graphdeco-faithful configuration — display-space compositing (the 3DGS training convention), classic uncompensated 0.3 screen-space dilation, reference view-Z ordering, and a half-float accumulation target resolved to the canvas once — and streams the PLY read through the library's Response-based parse API so fetch and parsing overlap. Query parameters can override every knob for local experiments; harness diagnostics now include loader phase timings and load-waterfall marks.
|
|
41
|
+
|
|
42
|
+
### Patch Changes
|
|
43
|
+
|
|
44
|
+
- Updated dependencies [beb026f]
|
|
45
|
+
- Updated dependencies [967a0ee]
|
|
46
|
+
- Updated dependencies [967a0ee]
|
|
47
|
+
- Updated dependencies [96be509]
|
|
48
|
+
- Updated dependencies [96be509]
|
|
49
|
+
- Updated dependencies [967a0ee]
|
|
50
|
+
- Updated dependencies [96be509]
|
|
51
|
+
- Updated dependencies [96be509]
|
|
52
|
+
- Updated dependencies [96be509]
|
|
53
|
+
- Updated dependencies [967a0ee]
|
|
54
|
+
- Updated dependencies [96be509]
|
|
55
|
+
- Updated dependencies [967a0ee]
|
|
56
|
+
- Updated dependencies [beb026f]
|
|
57
|
+
- Updated dependencies [0c23333]
|
|
58
|
+
- Updated dependencies [e8e7e30]
|
|
59
|
+
- Updated dependencies [a59c7b8]
|
|
60
|
+
- Updated dependencies [beb026f]
|
|
61
|
+
- Updated dependencies [967a0ee]
|
|
62
|
+
- Updated dependencies [8bd64d6]
|
|
63
|
+
- Updated dependencies [a59c7b8]
|
|
64
|
+
- Updated dependencies [967a0ee]
|
|
65
|
+
- Updated dependencies [b328fab]
|
|
66
|
+
- Updated dependencies [0ca530e]
|
|
67
|
+
- Updated dependencies [beb026f]
|
|
68
|
+
- Updated dependencies [8bd64d6]
|
|
69
|
+
- Updated dependencies [e8e7e30]
|
|
70
|
+
- Updated dependencies [967a0ee]
|
|
71
|
+
- Updated dependencies [0ca530e]
|
|
72
|
+
- Updated dependencies [967a0ee]
|
|
73
|
+
- Updated dependencies [9daa49d]
|
|
74
|
+
- Updated dependencies [9daa49d]
|
|
75
|
+
- Updated dependencies [beb026f]
|
|
76
|
+
- Updated dependencies [9daa49d]
|
|
77
|
+
- Updated dependencies [967a0ee]
|
|
78
|
+
- Updated dependencies [967a0ee]
|
|
79
|
+
- Updated dependencies [74a7597]
|
|
80
|
+
- Updated dependencies [0c23333]
|
|
81
|
+
- Updated dependencies [e8e7e30]
|
|
82
|
+
- three-blocks@0.3.0
|
|
83
|
+
|
|
84
|
+
## 0.0.0
|
|
85
|
+
|
|
86
|
+
- Reserved for the first public release.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
Required Notice: Copyright (c) 2025-2026 ロリンジャー株式会社 (Rohlinger K.K.), doing business as Three.js Blocks (https://threejs-blocks.com)
|
|
2
|
+
|
|
3
|
+
# PolyForm Noncommercial License 1.0.0
|
|
4
|
+
|
|
5
|
+
<https://polyformproject.org/licenses/noncommercial/1.0.0>
|
|
6
|
+
|
|
7
|
+
## Acceptance
|
|
8
|
+
|
|
9
|
+
In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
|
|
10
|
+
|
|
11
|
+
## Copyright License
|
|
12
|
+
|
|
13
|
+
The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
|
|
14
|
+
|
|
15
|
+
## Distribution License
|
|
16
|
+
|
|
17
|
+
The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
|
|
18
|
+
|
|
19
|
+
## Notices
|
|
20
|
+
|
|
21
|
+
You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
|
|
22
|
+
|
|
23
|
+
> Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
|
|
24
|
+
|
|
25
|
+
## Changes and New Works License
|
|
26
|
+
|
|
27
|
+
The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
|
|
28
|
+
|
|
29
|
+
## Patent License
|
|
30
|
+
|
|
31
|
+
The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
|
|
32
|
+
|
|
33
|
+
## Noncommercial Purposes
|
|
34
|
+
|
|
35
|
+
Any noncommercial purpose is a permitted purpose.
|
|
36
|
+
|
|
37
|
+
## Personal Uses
|
|
38
|
+
|
|
39
|
+
Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
|
|
40
|
+
|
|
41
|
+
## Noncommercial Organizations
|
|
42
|
+
|
|
43
|
+
Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
|
|
44
|
+
|
|
45
|
+
## Fair Use
|
|
46
|
+
|
|
47
|
+
You may have "fair use" rights for the software under the law. These terms do not limit them.
|
|
48
|
+
|
|
49
|
+
## No Other Rights
|
|
50
|
+
|
|
51
|
+
These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
|
|
52
|
+
|
|
53
|
+
## Patent Defense
|
|
54
|
+
|
|
55
|
+
If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
|
|
56
|
+
|
|
57
|
+
## Violations
|
|
58
|
+
|
|
59
|
+
The first time you are notified in writing that you have violated these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
|
|
60
|
+
|
|
61
|
+
## No Liability
|
|
62
|
+
|
|
63
|
+
***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
|
|
64
|
+
|
|
65
|
+
## Definitions
|
|
66
|
+
|
|
67
|
+
The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
|
|
68
|
+
|
|
69
|
+
**You** refers to the individual or entity agreeing to these terms.
|
|
70
|
+
|
|
71
|
+
**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
|
|
72
|
+
|
|
73
|
+
**Your licenses** are all the licenses granted to you for the software under these terms.
|
|
74
|
+
|
|
75
|
+
**Use** means anything you do with the software requiring one of your licenses.
|
package/NOTICE
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Required Notice: Copyright (c) 2025-2026 ロリンジャー株式会社 (Rohlinger K.K.), doing business as Three.js Blocks (https://threejs-blocks.com)
|
|
2
|
+
|
|
3
|
+
Three.js Blocks licensing notice
|
|
4
|
+
================================
|
|
5
|
+
|
|
6
|
+
This software is offered under the PolyForm Noncommercial License 1.0.0:
|
|
7
|
+
https://polyformproject.org/licenses/noncommercial/1.0.0/
|
|
8
|
+
|
|
9
|
+
LICENSE contains the controlling noncommercial terms. Commercial customers
|
|
10
|
+
receive separate rights under the agreement they accept:
|
|
11
|
+
https://threejs-blocks.com/license
|
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# three-blocks-benchmark
|
|
2
|
+
|
|
3
|
+
Reproducible browser benchmarks for Three Blocks, Spark, and SuperSplat.
|
|
4
|
+
The default `standard` suite uses fixed held-out cameras from Mip-NeRF 360
|
|
5
|
+
Bonsai and a pinned NerfBaselines Graphdeco 30K artifact. The synthetic
|
|
6
|
+
`micro` suite is performance-only.
|
|
7
|
+
|
|
8
|
+
Published results and methodology:
|
|
9
|
+
<https://threejs-blocks.com/benchmark/gaussian>
|
|
10
|
+
|
|
11
|
+
## Run
|
|
12
|
+
|
|
13
|
+
Install Chromium once:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npx playwright install chromium
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Run the one-view standard validation from npm:
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npx three-blocks-benchmark --suite standard --quick --output ./benchmark-results
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or run it with Bun:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
bunx three-blocks-benchmark --suite standard --quick --output ./benchmark-results
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Remove `--quick` for the publication run. Publication evidence requires headed
|
|
32
|
+
Chromium on a physical GPU:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
npx three-blocks-benchmark --suite standard --headed --output ./benchmark-results
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The standard suite range-downloads and caches only the stored PLY, selected
|
|
39
|
+
cameras, ground truth, upstream predictions, and provenance JSON. Use
|
|
40
|
+
`--cache <directory>` to choose the cache. The output directory receives local
|
|
41
|
+
renderer captures and `benchmark.json`; upstream and ground-truth PNGs stay in
|
|
42
|
+
the cache. Use `--omit-captures` for metrics-only output. Standard inputs,
|
|
43
|
+
references, and captures must not be redistributed without rights clearance.
|
|
44
|
+
The package contains no Bonsai dataset or model bytes; runtime downloads remain
|
|
45
|
+
subject to their upstream terms.
|
|
46
|
+
|
|
47
|
+
Run the generated performance microbenchmarks without network data:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
bunx three-blocks-benchmark --suite micro --quick --output ./micro-results
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Use `--report <file>` to place the JSON elsewhere and `--scene <id>` to select
|
|
54
|
+
a micro scene.
|
|
55
|
+
`--revision <value>` and `--dirty` add optional repository metadata; neither
|
|
56
|
+
Git nor a checkout is required.
|
|
57
|
+
|
|
58
|
+
The CLI uses headed Chromium by default on macOS so WebGPU captures reach the
|
|
59
|
+
physical GPU. `--headless` is available where the browser exposes a working
|
|
60
|
+
WebGPU adapter in headless mode.
|
|
61
|
+
|
|
62
|
+
Standard reports contain neutral PSNR and dm_pix-compatible SSIM versus ground
|
|
63
|
+
truth. Metrics versus the pinned NerfBaselines Graphdeco 30K prediction are
|
|
64
|
+
separately labeled renderer conformance and only verify camera/projection
|
|
65
|
+
alignment. The three-view subset is not the canonical 37-view aggregate.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { runBenchmark } from '../lib/run.mjs';
|
|
7
|
+
|
|
8
|
+
const packageRoot = path.resolve( path.dirname( fileURLToPath( import.meta.url ) ), '..' );
|
|
9
|
+
const { version } = JSON.parse( await readFile( path.join( packageRoot, 'package.json' ), 'utf8' ) );
|
|
10
|
+
const HELP = `three-blocks-benchmark ${version}
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
three-blocks-benchmark --output <directory> [options]
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
--suite <standard|micro> Run canonical Bonsai quality or synthetic performance
|
|
17
|
+
--output <directory> Write captures and the default benchmark.json here
|
|
18
|
+
--cache <directory> Cache selectively downloaded standard-suite members
|
|
19
|
+
--report <file> Write the JSON report to a different path
|
|
20
|
+
--capture-url-prefix <url> Prefix capture paths stored in the report
|
|
21
|
+
--scene <id> Select a micro scene
|
|
22
|
+
--quick Use one view/scene and short measurements
|
|
23
|
+
--omit-captures Write metrics JSON without renderer captures
|
|
24
|
+
--headed Show Chromium
|
|
25
|
+
--headless Hide Chromium
|
|
26
|
+
--revision <value> Record an optional source revision
|
|
27
|
+
--dirty Record that the source tree had changes
|
|
28
|
+
--clean Record that the source tree was clean
|
|
29
|
+
--help Show this help
|
|
30
|
+
--version Print the package version
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
function parseArgs( rawArgs ) {
|
|
34
|
+
|
|
35
|
+
const options = {};
|
|
36
|
+
for ( let index = 0; index < rawArgs.length; index ++ ) {
|
|
37
|
+
|
|
38
|
+
const argument = rawArgs[ index ];
|
|
39
|
+
if ( argument === '--quick' ) options.quick = true;
|
|
40
|
+
else if ( argument === '--omit-captures' ) options.omitCaptures = true;
|
|
41
|
+
else if ( argument === '--headed' ) options.headed = true;
|
|
42
|
+
else if ( argument === '--headless' ) options.headed = false;
|
|
43
|
+
else if ( argument === '--dirty' ) options.workingTreeDirty = true;
|
|
44
|
+
else if ( argument === '--clean' ) options.workingTreeDirty = false;
|
|
45
|
+
else if ( [ '--suite', '--output', '--cache', '--report', '--capture-url-prefix', '--scene', '--revision' ].includes( argument ) ) {
|
|
46
|
+
|
|
47
|
+
const value = rawArgs[ ++ index ];
|
|
48
|
+
if ( ! value || value.startsWith( '--' ) ) throw new Error( `${argument} requires a value.` );
|
|
49
|
+
const key = {
|
|
50
|
+
'--suite': 'suite',
|
|
51
|
+
'--output': 'output',
|
|
52
|
+
'--cache': 'cache',
|
|
53
|
+
'--report': 'report',
|
|
54
|
+
'--capture-url-prefix': 'captureUrlPrefix',
|
|
55
|
+
'--scene': 'scene',
|
|
56
|
+
'--revision': 'revision',
|
|
57
|
+
}[ argument ];
|
|
58
|
+
options[ key ] = value;
|
|
59
|
+
|
|
60
|
+
} else {
|
|
61
|
+
|
|
62
|
+
throw new Error( `Unknown option: ${argument}` );
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
if ( ! options.output ) throw new Error( '--output is required.' );
|
|
68
|
+
return options;
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const args = process.argv.slice( 2 );
|
|
73
|
+
if ( args.includes( '--help' ) ) {
|
|
74
|
+
|
|
75
|
+
process.stdout.write( HELP );
|
|
76
|
+
|
|
77
|
+
} else if ( args.includes( '--version' ) ) {
|
|
78
|
+
|
|
79
|
+
process.stdout.write( `${version}\n` );
|
|
80
|
+
|
|
81
|
+
} else {
|
|
82
|
+
|
|
83
|
+
runBenchmark( parseArgs( args ) ).catch( error => {
|
|
84
|
+
|
|
85
|
+
console.error( error );
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
|
|
88
|
+
} );
|
|
89
|
+
|
|
90
|
+
}
|