Files
rhinelab-ui/scripts/check-super-performance.mjs
T

27 lines
4.8 KiB
JavaScript

import {createRequire} from 'node:module';
import {mkdir,writeFile} from 'node:fs/promises';
import assert from 'node:assert/strict';
const require=createRequire(import.meta.url),{chromium}=require(process.env.PLAYWRIGHT_MODULE || 'playwright');
const browser=await chromium.launch({channel:'msedge',headless:true});
const page=await browser.newPage({viewport:{width:1920,height:1080},deviceScaleFactor:1});
const errors=[];page.on('pageerror',e=>errors.push(String(e)));page.on('console',m=>{if(m.type()==='error'&&/THREE|shader|WebGL/.test(m.text()))errors.push(m.text())});
await page.goto('http://127.0.0.1:5176/?scene=archive');await page.waitForFunction(()=>window.rhine?.stats().ready);
const apply=async(values,wait=1500)=>{await page.evaluate(values=>window.wallpaperPropertyListener.applyUserProperties(Object.fromEntries(Object.entries(values).map(([k,value])=>[k,{value}]))),values);await page.waitForTimeout(wait)};
await apply({boot:false,desktopmode:'workbench',sound:false,music:false,reduced:false,renderquality:'original',hudparallax:true,huddepth:20,hudtracking:false,uifrost:true,screenfinish:true,screengrain:20,screenfringe:20,screenvignette:20,audioreactive:true,selectionstyle:'original'});
await page.evaluate(()=>window.wallpaperPropertyListener.applyGeneralProperties({fps:60}));
const measure=()=>page.evaluate(()=>{const host=document.querySelector('#three-scene'),canvas=host.querySelector('canvas'),gl=canvas.getContext('webgl2'),ext=gl.getExtension('WEBGL_debug_renderer_info');return {quality:JSON.parse(host.dataset.renderQuality),stats:window.rhine.stats(),font:getComputedStyle(document.querySelector('.wb-clock')).fontSize,screen:document.querySelector('#stage').dataset.screenFinish,gpu:ext?gl.getParameter(ext.UNMASKED_RENDERER_WEBGL):gl.getParameter(gl.RENDERER)}});
await mkdir('verification/super-performance',{recursive:true});
await page.waitForTimeout(6000);const original=await measure();await page.screenshot({path:'verification/super-performance/original.png'});
await apply({superperformance:true},6000);const fast=await measure();await page.screenshot({path:'verification/super-performance/super.png'});
assert.equal(fast.stats.superPerformance,true);assert.equal(fast.stats.motion.reduced,false);assert.equal(fast.quality.shadows,0);assert.equal(fast.quality.aoSamples,0);assert.equal(fast.quality.depthOfField,0);assert.equal(fast.screen,'false');assert.equal(fast.font,original.font);assert.ok(fast.quality.width*fast.quality.height<=921600);assert.ok(fast.stats.drawCalls<original.stats.drawCalls);assert.ok(fast.stats.triangles<original.stats.triangles);
await page.evaluate(()=>window.rhine.select(9));await page.waitForTimeout(180);assert.equal((await measure()).stats.selected,'X-010');
await apply({desktopmode:'archive'});await page.waitForTimeout(1000);await page.evaluate(()=>window.rhine.detail());await page.waitForTimeout(3500);assert.equal((await measure()).stats.mode,'detail');await page.screenshot({path:'verification/super-performance/detail.png'});
await page.evaluate(()=>window.rhine.archive());await page.waitForTimeout(1200);
await apply({superperformance:false},4000);const restored=await measure();assert.equal(restored.quality.width,original.quality.width);assert.equal(restored.quality.shadows,original.quality.shadows);assert.equal(restored.screen,'true');assert.equal(restored.stats.motion.reduced,false);
await apply({renderquality:'custom',qualityscale:75,qualityshadows:'0',qualityaosamples:'0',qualitydepthoffield:0,qualitytransmission:'0.5',qualitypixelratio:'1'});const custom=await measure();assert.equal(custom.quality.shadows,0);assert.equal(custom.quality.transmission,.5);assert.equal(custom.quality.width,1440);
await apply({qualityscale:65});const partial=await measure();assert.equal(partial.quality.width,1248);assert.equal(partial.quality.transmission,.5);
await apply({superperformance:true});await apply({qualityscale:85});assert.ok((await measure()).quality.width<=1280);
await apply({superperformance:false});const customRestored=await measure();assert.equal(customRestored.quality.width,1632);assert.equal(customRestored.quality.transmission,.5);
await page.setViewportSize({width:3840,height:2160});await apply({superperformance:true});const uhd=await measure();assert.ok(uhd.quality.width*uhd.quality.height<=921600);
assert.deepEqual(errors,[]);await writeFile('verification/super-performance/results.json',JSON.stringify({original,fast,restored,custom,partial,customRestored,uhd,errors},null,2));console.log(JSON.stringify({original:{pixels:original.quality.width*original.quality.height,calls:original.stats.drawCalls,triangles:original.stats.triangles,fps:original.stats.fps},fast:{pixels:fast.quality.width*fast.quality.height,calls:fast.stats.drawCalls,triangles:fast.stats.triangles,fps:fast.stats.fps},gpu:fast.gpu,checks:'motion, detail, restore, custom partial callbacks, override recovery, 4K pixel budget passed'}));await browser.close();