three-blocks-benchmark 0.6.1 → 0.6.2

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 CHANGED
@@ -1,5 +1,18 @@
1
1
  # three-blocks-benchmark
2
2
 
3
+ ## 0.6.2
4
+
5
+ ### Patch Changes
6
+
7
+ - ec85229: Website: Gaussian benchmarks compare raster and compute tiles with fresh Node.js measurements.
8
+ - Updated dependencies [ec85229]
9
+ - Updated dependencies [ec85229]
10
+ - Updated dependencies [ec85229]
11
+ - Updated dependencies [ec85229]
12
+ - Updated dependencies [ec85229]
13
+ - three-blocks@0.14.0
14
+ - @three-blocks/devtools@13.0.0
15
+
3
16
  ## 0.6.1
4
17
 
5
18
  ### Patch Changes
package/README.md CHANGED
@@ -13,6 +13,11 @@ It uses full-precision depth keys and wider Gaussian support cropped at the
13
13
  fragment alpha threshold. Load, frame time, memory, and image quality all use
14
14
  that same configuration.
15
15
 
16
+ The default raster path and the opt-in compute-tile path have separate results.
17
+ Compute tiles use premultiplied alpha and cached SH refreshed on every camera
18
+ change, with the same quality preset and native resolution. Cold load includes
19
+ tile capacity validation; measured frames must use compute tiles without raster fallback.
20
+
16
21
  Published results and methodology:
17
22
  <https://threejs-blocks.com/benchmark/gaussian>
18
23
 
@@ -81,7 +86,7 @@ shared SH3 PLY; its effective degree is recorded and labeled on the website.
81
86
  The Editor 3.0 column runs its verbatim projector, radix sorter and draw shaders
82
87
  with sorted transparency and fp16 accumulation; it excludes editor UI and the
83
88
  motion-adaptive stochastic mode. It consumes resident PLY bytes using the
84
- loader's `MemoryReadFileSystem`, so page memory includes the retained source
89
+ loader's `MemoryReadFileSystem`, so process memory includes the retained source
85
90
  PLY. This does not reproduce the editor's file-backed memory figures. See
86
91
  `vendor/README.md` for provenance. The viewer is a separate product and column.
87
92
 
@@ -91,9 +91,18 @@ async function createThreeBlocks( bytes ) {
91
91
  // compositing (the 3DGS training convention), classic uncompensated 0.3 screen-space
92
92
  // dilation, and reference view-Z ordering.
93
93
  const standard = suiteId === 'standard';
94
+ const computeTiles = rendererId === 'three-blocks-compute';
94
95
  const compositing = query.get( 'compositing' ) ?? ( standard ? 'display' : 'linear' );
95
96
  const sortPrecision = query.get( 'sortprec' );
96
97
  const parseOptions = {
98
+ ...( computeTiles ? {
99
+ rendererMode: 'compute-tiles',
100
+ alphaMode: 'premultiplied',
101
+ shColorMode: 'cached',
102
+ shColorUpdateAngle: 0,
103
+ shColorUpdateDistance: 0,
104
+ computeTiles: { allowRasterFallback: false },
105
+ } : {} ),
97
106
  enableSH: standard,
98
107
  shDegree: query.has( 'shdegree' ) ? Number( query.get( 'shdegree' ) ) : ( standard ? 3 : 0 ),
99
108
  coordinateSystem: 'threejs',
@@ -204,9 +213,23 @@ async function createThreeBlocks( bytes ) {
204
213
 
205
214
  setThreeCamera( camera, pose );
206
215
  await renderScene( scene3d );
216
+ if ( computeTiles && benchmarkPhase === 'measure' && splats.stats.rendererMode !== 'compute-tiles' ) {
217
+
218
+ throw new Error( `Compute tiles unavailable during measurement: ${splats.stats.computeTiles?.fallbackReason}` );
219
+
220
+ }
207
221
 
208
222
  };
209
223
  await render( benchmarkPose );
224
+ // Include capacity validation and compilation in cold load, before timing any frames.
225
+ const readyDeadline = performance.now() + 30_000;
226
+ while ( computeTiles && splats.stats.rendererMode !== 'compute-tiles' ) {
227
+
228
+ if ( performance.now() > readyDeadline ) throw new Error( `Compute tiles failed to initialize: ${splats.stats.computeTiles?.fallbackReason}` );
229
+ await new Promise( resolve => setTimeout( resolve, 0 ) );
230
+ await render( benchmarkPose );
231
+
232
+ }
210
233
  loadMarks.firstFrame = performance.now();
211
234
  return {
212
235
  backend: 'WebGPU',
@@ -218,6 +241,7 @@ async function createThreeBlocks( bytes ) {
218
241
  reportedGpuBytes: stats.gpuBytes,
219
242
  reportedGpuBytesScope: 'Three Blocks Gaussian resources',
220
243
  rendererMode: stats.rendererMode,
244
+ ...( computeTiles ? { computeTiles: stats.computeTiles } : {} ),
221
245
  loadTimings: stats.loadTimings,
222
246
  loadMarks: { ...loadMarks },
223
247
  };
@@ -714,7 +738,7 @@ async function measureBrowserMemory() {
714
738
  async function run() {
715
739
 
716
740
  if ( ! [ 'standard', 'micro' ].includes( suiteId ) ) throw new Error( `Unknown suite: ${suiteId}` );
717
- if ( ! [ 'three-blocks', 'three-gs', 'spark', 'supersplat', 'supersplat-editor', 'gs3d', 'babylon' ].includes( rendererId ) ) {
741
+ if ( ! [ 'three-blocks', 'three-blocks-compute', 'three-gs', 'spark', 'supersplat', 'supersplat-editor', 'gs3d', 'babylon' ].includes( rendererId ) ) {
718
742
 
719
743
  throw new Error( `Unknown renderer: ${rendererId}` );
720
744
 
package/lib/run.mjs CHANGED
@@ -51,6 +51,14 @@ const RENDERERS = [
51
51
  backend: 'WebGPU',
52
52
  source: 'https://www.npmjs.com/package/three-blocks',
53
53
  },
54
+ {
55
+ id: 'three-blocks-compute',
56
+ label: 'Three Blocks compute tiles',
57
+ profile: 'quality · compute tiles',
58
+ version: threeBlocksManifest.version,
59
+ backend: 'WebGPU',
60
+ source: 'https://www.npmjs.com/package/three-blocks',
61
+ },
54
62
  {
55
63
  id: 'three-gs',
56
64
  label: 'three.js splats',
@@ -715,11 +723,12 @@ export async function runBenchmark( options ) {
715
723
  },
716
724
  limitations: suiteId === 'standard'
717
725
  ? [
718
- 'The three-view browser subset is not the canonical 37-view aggregate.',
726
+ 'The three-view Node renderer subset is not the canonical 37-view aggregate.',
727
+ 'Three Blocks is measured in separate raster and compute-tile configurations. Compute tiles use premultiplied alpha and cached SH refreshed for every camera change; both retain the quality preset and native resolution.',
719
728
  'Frame timing serializes a complete current-camera sort and draw, including worker round trips in GaussianSplats3D and Babylon.js. It measures frame latency, not pipelined interactive FPS. Both SuperSplat columns use GPU sorting.',
720
729
  'GaussianSplats3D 0.4.7 supports SH2 maximum; it receives the same SH3 PLY but omits the third band. Its lower feature ceiling remains reflected in the quality scores.',
721
- 'SuperSplat Editor 3.0 is its renderer and loader in a neutral scene, without editor UI or motion-adaptive stochastic transparency. Its resident PLY source counts towards page memory; this is not the editor file-backed memory workload.',
722
- 'The official addon uses three.js 0.186.0. Three Blocks and the other Three.js-based viewers retain three.js 0.185.1; this is a product comparison, not an isolated engine-version experiment.',
730
+ 'SuperSplat Editor 3.0 is its renderer and loader in a neutral scene, without editor UI or motion-adaptive stochastic transparency. Its resident PLY source counts towards process memory; this is not the editor file-backed memory workload.',
731
+ 'The Three.js-based columns use three.js 0.186.0; this is a product comparison, not an isolated rendering-algorithm experiment.',
723
732
  'Quick mode is one-view validation evidence, not publication evidence.',
724
733
  'Standard captures and downloaded reference images are local-only unless redistribution rights are cleared.',
725
734
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-blocks-benchmark",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "Reproducible Gaussian splat benchmarks for Three Blocks, three.js r186, Spark, SuperSplat Viewer and Editor 3, GaussianSplats3D, and Babylon.js",
5
5
  "keywords": [
6
6
  "three",
@@ -51,11 +51,11 @@
51
51
  "@playcanvas/splat-transform": "3.3.3",
52
52
  "@playcanvas/supersplat-viewer": "1.31.2",
53
53
  "@sparkjsdev/spark": "2.1.0",
54
- "@three-blocks/devtools": "12.0.0",
54
+ "@three-blocks/devtools": "13.0.0",
55
55
  "playcanvas": "2.22.0",
56
56
  "pngjs": "7.0.0",
57
57
  "three": "0.186.0",
58
- "three-blocks": "0.13.0",
58
+ "three-blocks": "0.14.0",
59
59
  "three-r186": "npm:three@0.186.0",
60
60
  "vite": "8.1.3"
61
61
  }