Quick answer: Fog of war hides parts of the world the player hasn't seen or can't currently see, usually tracking explored versus visible areas separately. It creates tension and rewards exploration, but needs efficient visibility computation and clear visual states.
Fog of war—concealing the parts of the world a player hasn't explored or can't currently see—is a staple of strategy and exploration games, creating tension and rewarding scouting. Building it well means tracking visibility correctly and computing it efficiently, while making the states clear to the player.
Explored versus visible are different states
The key insight in fog of war is that there are usually three states, not two: unexplored (never seen, fully hidden), explored-but-not-currently-visible (seen before, so terrain is remembered but current activity is hidden), and currently visible (in view right now, fully revealed). Tracking explored and visible separately is what produces the familiar effect where you remember the map you've explored but can't see what's happening there now unless a unit currently has vision. This three-state model is the foundation of fog of war: the explored state is a persistent record of what you've discovered, while the visible state is the current frame's vision, computed each update from your units' or player's sightlines. Getting this distinction right—persistent exploration memory plus current visibility—is what makes fog of war work as players expect.
Efficient visibility computation and clear visual states are what make a fog of war system practical and readable. Computing what's currently visible—from unit positions, sight ranges, and line of sight against obstacles—has to be efficient, since it's recomputed as units move, and naive per-cell visibility checks can be expensive at scale, so techniques like updating visibility only when needed and efficient sightline computation keep it performant. Just as important is making the states clearly readable: unexplored areas fully hidden, explored areas shown dimmed or desaturated to indicate remembered-but-not-current, and visible areas fully revealed, so the player can instantly tell what they can currently see, what they've explored, and what's unknown. Clear visual distinction between the three states is what makes fog of war informative rather than confusing. Combining the three-state model (unexplored, explored, visible) with efficient visibility computation (so it performs at scale) and clear visual states (so the player reads them instantly) gives you a fog of war system that creates the tension and exploration-reward the mechanic provides, while staying performant and readable.
The player doesn't see what you see
You know where to click, which path works, and what every system is supposed to do, because you built it — and that knowledge makes you the worst possible judge of how your game reads to someone encountering it fresh. The confusion you can't feel is exactly the confusion that costs you players.
This is why fresh eyes are so valuable and so uncomfortable: they reveal the gap between the game in your head and the game on the screen. Put your work in front of people who've never seen it, watch where they stumble, and treat that stumble as information rather than as their mistake.
Default to the boring, robust choice
It's tempting to reach for the clever, novel, or technically impressive solution, but in production the boring choice — the well-understood approach, the proven pattern, the simple implementation — is usually the one that ships and keeps working. Cleverness has a way of becoming the bug you're debugging at 2am six months later.
Save your novelty budget for the things that actually make your game distinctive, and be conservative everywhere else. A game built on robust, unremarkable foundations is one you can keep building on, while one built on clever fragility is one that fights you the whole way.
Make the common case effortless
Most of what a player does, they do over and over, and most of what you build will be exercised in a handful of common situations far more than in the edge cases. Optimising the rare and neglecting the frequent is a reliable way to make a game that's technically complete and practically annoying.
So spend your polish where the volume is: the action repeated a thousand times, the menu opened constantly, the path every player walks. Making the common case smooth and satisfying does more for how the game feels than perfecting the corners almost nobody reaches.
Protect the thing that makes it special
Every game that connects has some core spark — a feeling, a mechanic, a tone — that's the real reason people love it, and that spark is fragile. In the rush to add content, fix problems, and respond to feedback, it's easy to sand away exactly the quality that made the game worth making in the first place.
Know what your spark is, and guard it. When a change threatens the thing that makes your game distinctive, that's the change to question hardest, because a game can survive plenty of rough edges but rarely survives losing its soul.
Why finishing beats perfecting
The hardest skill in indie development isn't any particular technique — it's finishing. Most games that never ship didn't fail on talent; they failed on scope, polished forever, or chased one more feature. The developers who build a real body of work are almost always the ones who got good at choosing something small enough to complete and then completing it.
That's worth keeping in mind here, because it's easy to let any one part of development expand to fill all your time. Decide what 'good enough to ship' looks like, protect that line, and treat the endless list of possible improvements as a backlog rather than a set of obligations.
Fog of war tracks unexplored, explored, and currently-visible as distinct states. Compute visibility efficiently and make the three states visually clear.