"""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 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.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 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'; 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()