GoldSrc Map Optimization: The Complete Checklist

January 29, 2026 Daemon666 9 min read 1 görüntülenme

A GoldSrc map runs well when it respects the engine's fixed limits and gives hlvis an easy job. Most performance and "map won't compile" problems trace back to a handful of habits. This is the checklist to run against any CS 1.6 map before release — each item is cheap, and together they keep the map inside the BSP v30 limits and fast on modest hardware.

1. NULL every face the player never sees

Apply the NULL tool texture to the backs of walls, undersides of floors, tops of skybox brushes, and any hidden brush side. NULL faces are removed at compile: no rendering, no lightmap, less work for every tool. This single habit reduces face count, wpoly, and lightmap usage across the whole map. It is the first thing to check when you hit AllocBlock: Full.

2. Convert decorative brushwork to func_detail

Trim, pipes, rails, signs, clutter, ornamental arches — anything non-structural — should be func_detail. It stays visible and lit but is removed from the BSP tree and from clipnode generation, which cuts face splitting and keeps you clear of MAX_MAP_CLIPNODES. Add a CLIP cage where a func_detail shape still needs to block the player.

3. Simplify the collision hull with CLIP

The player does not need pixel-accurate collision. Wrap complex geometry (rocks, many-sided pillars, terrain) in simple CLIP brushes and let the visual shape be func_detail. Fewer, simpler solid brushes means fewer clipnodes and smoother movement with no snagging.

4. Control texture scale for lightmaps

Large faces at a small texture scale generate huge lightmaps. Raise the scale on big, low-detail surfaces (ceilings, outer walls, floors under props) to shrink their lightmap footprint, and keep detailed surfaces at 1.0. Run a compile with -chart and read the lightmap line:

hlrad -chart mymap.bsp

5. Seal the map and kill leaks first

VIS optimization is meaningless if the map leaks — a leak makes hlvis either fail or treat the whole level as one visible blob. Confirm a clean compile with no leak, using the pointfile if needed; see the leak/pointfile guide. A sealed hull is the precondition for everything below.

6. Cut visibility with VIS-aware layout and hint brushes

Long unbroken sightlines force the engine to draw huge amounts of the map at once. Break lines of sight with geometry, and place hint brushes (faced with hint, backed by skip) at doorways and corners to split visleafs so the engine culls what is around the corner. This is the core of keeping wpoly low; see VIS optimization with hint brushes. Run the full hlvis pass (not -fast) for the release build.

7. Keep entities and wpoly in budget

Watch the in-game r_speeds: aim to keep wpoly (world polygons in view) well under a few thousand in the busiest spot on a public server. Merge tiny brushes, remove invisible detail, and avoid huge open rooms full of geometry. Fewer func_ entities where a world brush will do also helps, as each entity is drawn separately.

8. Final compile discipline

Always run the whole chain in order — hlcsg → hlbsp → hlvis → hlrad — for the release, with full VIS and full RAD, and read the -chart output at the end. Vluzacn's VHLT v34 gives the clearest limit report. Fix every warning; a clean log is the goal.

Common errors

  • High wpoly / choppy on open maps — long sightlines and no hint brushes. Break sight lines and add hints.
  • Compile hits a limit — NULL hidden faces and func_detail the clutter; see the clipnodes and AllocBlock fixes.
  • VIS took forever or did nothing — the map leaks, or you ran -fast. Seal it, then run full VIS.
  • Map looks flat after scaling textures — you scaled detailed faces. Only scale large, low-detail surfaces.
  • Player snags on invisible edges — a CLIP cage is oversized or a func_detail is unexpectedly solid. Tighten the collision.

Verification

Compile the release build with full VIS and RAD, open the map, and turn on r_speeds 1 (or developer 1) to watch wpoly and epoly as you walk the busiest routes. Confirm wpoly stays in budget around corners — if it does not drop when you round a corner, your hint brushes are not splitting visibility there. Check the -chart report shows headroom on faces, clipnodes and lightmaps. Once those numbers are healthy and the log is warning-free, the map is ready to package for FastDL.

Katkıda bulunanlar: Daemon666 ✦
Paylaş: