Blog

Why browser ai game makers hit a ceiling

8 min read

A tab is the best on-ramp in software and a constrained place to finish a project. What browser tools genuinely do better, where the limit actually comes from, and how to decide which side of it you are on.

Start with what the browser wins outright

Any argument about this that opens with the limitations is dishonest by omission, because the browser wins several things so completely that nothing else in the category comes close.

The first is the on-ramp. There is a URL, you click it, and you are in. Nothing to fetch, nothing to approve, nothing that asks your machine for permission, nothing that a locked-down work laptop or a school computer will refuse. For somebody who is not sure whether they want to make a game at all, that removes the single largest reason people never find out.

The second is sharing. A finished thing is a link, and a link works on a phone in a queue, on a friend's laptop, in a message. If you want thirty people to try your prototype tonight, a link is the only tool that reliably achieves it. Anyone who has watched a jam entry get skipped because a stranger would not run an unknown executable knows exactly how much that is worth.

The third is that the environment is identical everywhere. There is no version drift, no dependency that failed to resolve, no path that only exists on your machine. Everyone is running the same thing, which makes support and collaboration far simpler than they are anywhere else.

Those are not small advantages. For a first project, for teaching, for a jam, for anything whose success is measured in how many people saw it, they can outweigh every other consideration on this page.

The ceiling is not about ambition

It is tempting to frame the limit as a matter of seriousness: browser tools for beginners, installed tools for real developers. That framing is wrong and it is also unhelpful, because it tells you nothing about where the boundary actually falls.

The boundary is structural. A browser tab is a sandbox by design, and the sandbox is the reason it is safe to open a link from a stranger. Every constraint discussed below is a direct consequence of the same design decision that makes the on-ramp so good. You cannot remove one without removing the other.

That is why this rarely improves the way people expect. It is not a matter of a team getting round to it. The restrictions are the product working correctly.

What follows is a description of where those restrictions start to bite in game work specifically, which is a domain that happens to press on almost all of them at once.

A tab has a memory budget and a project does not care

Games are unusually memory hungry. Textures, meshes, audio buffers, and level data all sit in memory at once, and a scene that looks modest on screen can be carrying a great deal behind it.

A tab gets a fraction of what the machine has, and it is not a fraction you control. Browsers reclaim aggressively, they suspend background tabs, and a runtime compiled to run inside one operates within an address space far smaller than the memory sitting in the computer. On a machine with thirty two gigabytes, the tab may be working with a small single-digit number of them.

For a small 2D game that is irrelevant. For a puzzle game, a card game, a platformer with a few dozen sprites, you will never approach it. The ceiling only becomes visible when the world gets large: a landscape with real draw distance, a set of high resolution textures, an audio bank with variations, a project that has accumulated four hundred assets over three months.

The failure is also not gradual. Things are fine and then the tab dies, and it dies at the point where you have most invested in the project.

Asset work wants a disk

Game development is unusual among creative work in how much of it is file handling. You are constantly importing images, replacing a texture, dropping in a sound, reorganising folders, batch renaming, and swapping a placeholder for the real thing.

A page cannot simply read your folders, and it should not be able to. So every one of those operations becomes an upload, or a picker dialogue, or a drag and drop, or a copy of the file living somewhere you cannot see. Individually each is a few seconds. Multiplied by the hundreds of times a real project does it, it becomes a tax on precisely the activity you do most.

It also breaks the tools you already use. The image editor on your machine cannot save directly into the project, so every edit becomes export, upload, and refresh. That round trip is short enough to tolerate and long enough to make you edit less, which quietly lowers the quality of the art.

The same applies to version control, backups, and simply looking at what you have got. A folder you can open is an underrated feature.

The graphics layer is a subset, on purpose

A tab talks to the graphics hardware through a mediated interface, and that interface is deliberately narrower than what the hardware exposes to a native application. Newer standards have narrowed the gap and have not closed it.

The practical consequences are specific rather than dramatic. Certain shader features are unavailable or behave differently. Compressed texture support varies by machine, so you either ship larger files or maintain several versions. Some rendering techniques that native engines use as a matter of course are either absent or expensive. Performance on the same hardware is generally lower, sometimes substantially.

Threading has its own version of this. Getting real parallelism in a page depends on the page being served with particular headers, and if those are not in place the code silently falls back to a single thread. That is the kind of detail nobody wants to think about while designing a level.

None of it stops a 2D game. All of it shapes what a 3D game can look like, and it shapes it in ways that are hard to see coming until you have already built the thing that will not run.

The tab is not the machine your game will run on

This is the mismatch that catches people latest and hurts most. If you build and test inside a tab, you have been judging your game on one specific performance profile, and it is not the profile the finished game will have.

A game that is comfortable in the browser will run better as a native build, which is a pleasant surprise. The reverse is the problem: a design tuned to what the tab could manage may have had its ambitions trimmed by an environment that had nothing to do with the game. You made the view distance shorter, or the crowd smaller, or the effect simpler, and you may not remember which of those were design decisions and which were accommodations.

Feel is the sharper version. Input latency and frame pacing are not identical inside a page, and both are load-bearing for how a game feels to play. If you tuned a jump against one timing profile and shipped against another, the tuning does not transfer cleanly.

The general rule holds everywhere in this craft: judge the game in the conditions it will actually be played in. Anything else is a rehearsal.

What you have at the end matters more than it seems

Ask the boring question early. When the project is done, what do you physically have.

Sometimes the answer is a folder of files in a documented format that a standard engine understands, and you could carry on with it elsewhere. Sometimes the answer is a project inside a service, exportable in some form, and the exported form may or may not be the thing you were working on. The difference is invisible for the first month and decisive in the second year.

This is not a hypothetical risk about companies disappearing, although that happens. It is a practical question about whether your project can grow past the tool. Games have a habit of outliving the plan for them. The one you started as a jam entry is the one somebody asks about eighteen months later.

Check it by trying it once, early, while the project is small. Export, open the result somewhere else, and see what you have. An hour spent on that question at the start is worth more than any amount of worrying about it later.

Where the two shapes actually sit

The honest split is not beginner and professional. It is small and fixed versus large and growing.

A tab is excellent for a project with a known, modest ceiling: a jam entry, a teaching exercise, a prototype meant to answer one question, a 2D game with a defined scope, anything whose main purpose is to be seen by a lot of people quickly. In those cases the on-ramp and the shareable link are worth more than any of the constraints cost you, and choosing anything else is choosing worse.

An installed environment earns its keep when the project keeps growing, when the asset count climbs into the hundreds, when it is 3D with any real scale, when you want your own tools operating on the same files, and when the finished thing needs to be a build people install and keep.

Plenty of projects change category halfway through, which is the real reason this matters. The switch is much cheaper if you asked the export question in week one.

Two things worth doing whichever side you land on

Test on the target early, even if the target is far off. If the game is eventually going to be an installed build, get one running in the first fortnight, however rough. If it is going to be a link, open the link on a phone. The first time you check should not be the week you planned to release.

And keep the source of your assets outside whatever tool you are using. The original images, the audio files, the notes. Tools change, and the difference between an annoying migration and an impossible one is usually whether the raw material was kept somewhere neutral.

Neither habit costs much. Both of them turn the ceiling from something you hit into something you saw approaching, and a limit you can see is just a planning constraint like any other.