Files
deepgrain-foundry/tools/perf.py
T

36 lines
1.8 KiB
Python

"""Times the renderer and the simulation in a headless browser: light, drawWorld (with and without
light and glow), the pixel upload and blit, and one simulation tick, in ms. Rebuild first.
python3 tools/perf.py
"""
import sys, pathlib
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent))
from use_venv import ensure_playwright; ensure_playwright()
from playwright.sync_api import sync_playwright
root = pathlib.Path(__file__).resolve().parent.parent
url = (root / 'dist' / 'index.html').as_uri()
with sync_playwright() as p:
b = p.chromium.launch(args=['--enable-gpu-rasterization','--ignore-gpu-blocklist'])
pg = b.new_page(viewport={'width': 1440, 'height': 860})
pg.goto(url); pg.evaluate("SET.fog = false"); pg.wait_for_timeout(300)
pg.evaluate("startNewWorld(424242, 1024, 640)")
pg.wait_for_function('GAME.running === true', timeout=20000)
pg.wait_for_timeout(500)
res = pg.evaluate('''() => {
const t = (f, n) => { const a = performance.now(); for (let k=0;k<n;k++) f(); return ((performance.now()-a)/n).toFixed(2); };
const out = {};
out.light = t(() => computeLight(), 20);
out.drawWorld = t(() => drawWorld(), 20);
SET.lighting = 'off'; out.drawWorldNoLight = t(() => drawWorld(), 20); SET.lighting='full';
SET.glow = 'off'; out.drawWorldNoGlow = t(() => drawWorld(), 20); SET.glow='low';
SET.fog = true; out.drawWorldFog = t(() => drawWorld(), 100);
SET.lighting = 'off'; out.drawWorldFogNoLight = t(() => drawWorld(), 100); SET.lighting = 'full'; SET.fog = false;
out.put = t(() => { R.bctx.putImageData(R.img,0,0); }, 20);
out.blit = t(() => { R.ctx.drawImage(R.buf, 0, 0, R.bw, R.bh, 0, 0, R.bw*R.zp, R.bh*R.zp); }, 20);
out.sim = t(() => simTick(), 60);
out.view = [R.bw, R.bh, R.zp, R.lw, R.lh];
return out;
}''')
print(res)
b.close()