EvonX
Live in every game

Game playtesting & performanceEvonx plays it before you do.

Every game ships with its own playtests: a robot player fires the cannon, sets off the TNT, breaks the jars and runs out of balls on purpose, and checks that the game does the right thing each time. A change only reaches your preview after its playtest passes, and a live game profiler shows what every frame costs.

37 / 37playtest checks passed on the smash template
60 fpsmedian of its 19 gameplay checks
45 sof real play behind every performance score

37 checks, one robot player

Every rule, played by a robot.

Automated game testing on the smash template: a robot player fires, misses, sets off TNT and runs out of balls on purpose, and checks that the game answers right each time. 37 passed, 0 failed.

pass60 fps
npm run playtestsmash template
  1. passboard · board the seams fire and a hook scales the score
  2. passbooster · booster bar arms and consumes
  3. passbooster · booster the seams fire and a hook adds a button
  4. passconfetti cannons · confetti cannons fire from both corners
  5. passhud shots · hud shots top
  6. passiap · iap a store release pays through the bridge
  7. passiap · iap a serverless store release grants from the device
  8. passlevelend · levelend banner sparks coins card
  9. passlevelend · levelend settles only a level the game has
  10. passlevelend · levelend card fits
  11. passlevelend · levelend the seams fire and a hook bends the coins
  12. passlevelend · levelend the verdict holds the input not the world
  13. passnav · nav deck and hanging sign

playtest: 37 passed, 0 failed

Performance score

Frame rate and stutter, one number.

Every game measures 45 seconds of real play on the player's own device: how many frames it draws and how many it misses. The two become one game performance score from 0 to 100, kept per game. Move the sliders to see how the score reads them.

100good
good ≥ 80fair ≥ 55poor < 55

score = 100 × (0.45 × fps from 20 to 55 + 0.55 × (1 − missed frames / 15%)), each part held between 0 and 1

59.98 vs 60.00fps with the measurement on and off, smash template: measuring costs nothing you can see
40–63 nsper frame for the measurement itself
Play onlymenus, paused games and hidden tabs are left out, so the score is what a player feels

What the playtests look for

The rules, tested by playing.

Each playtest plays a moment of the game and asserts what must happen. These are the smash template's gameplay checks, each with the screenshot it took and what it measured.

A press fires a ball
A press fires a ball59.6 fps · 14 draw calls · 29,596 triangles
A ball never flies through a piece
A ball never flies through a piece59.9 fps · 12 draw calls · 29,036 triangles
TNT goes off
TNT goes off59.7 fps · 27 draw calls · 49,864 triangles
A jar breaks
A jar breaks56.3 fps · 18 draw calls · 27,240 triangles
A fallen can splashes and sinks
A fallen can splashes and sinks59.1 fps · 14 draw calls · 21,852 triangles
A plank holds its cans
A plank holds its cans60 fps · 14 draw calls · 24,496 triangles
The balls run out and the offer comes
The balls run out and the offer comes58.9 fps · 20 draw calls · 24,880 triangles
No shot while paused
No shot while paused60 fps · 10 draw calls · 25,996 triangles
Draw budget
Draw budget59.2 fps · 23 draw calls · 104,694 triangles

Before you see a change

Red stops the change. Green ships it.

When you ask for a change, the server runs the game's own proofs in the build before telling you it is done:

1The code compiles: npm run typecheck
2The playtests written for this change pass, and so does every game pack the change touched.
3If a rule moved, every level is solved again: npm run levels:solve
4A red check refuses the step with the failing check and its output; your preview stays on the last version that passed.

Questions

Game playtesting, answered.

What does a playtest check?

That the game does what its rules say when it is played: a press fires a ball, a ball never flies through a piece, TNT goes off, a jar breaks, a fallen can splashes and sinks, the balls run out and the offer comes, no shot leaves while the game is paused. The smash template has 37 such checks.

What happens when a check fails?

The change is refused with the failing check and its output, and the preview stays on the last version that passed, so you never play a build that broke a rule.

How is the performance score worked out?

From 45 seconds of real play: the frame rate counts for 45% (from 20 to 55 fps) and the share of missed frames for 55% (0 to 15%). 80 and above is good, 55 and above fair.

Does measuring slow the game down?

No. With the measurement on and off the smash template ran at 59.98 and 60.00 fps; the measurement takes 40 to 63 nanoseconds a frame.

What does the game profiler show?

A strip along the top of the game: an fps counter, the slowest recent frame, frame time, CPU and GPU time, draw calls, triangles, vertices and memory, each coloured from green to red. Add ?profiler to a game's address to turn it on; in the Evonx editor it sits beside the preview.

Does a game run at 120 fps?

On a 60 or 90 Hz screen a game draws every frame the screen shows. On a 120 or 144 Hz phone it draws every other frame on purpose: nothing in a casual game moves faster than a 60 Hz screen shows, and twice the frames only doubles the work and warms the phone.

Tested before you play. Scored while you do.

Start free and build a game that checks itself.

Start free