Quick answer: Reuse identical x, y, width, height, inside, and notme arguments for both calls. Or call instance_activate_all() to recover all.

You deactivate with bounds (0, 0, 1024, 768, true). You reactivate with (-100, -100, 1024, 768, true). Some instances are outside the second region; they stay deactivated and become invisible zombies.

The Fix

// Deactivation
var _x  = camera_get_view_x(view_camera[0]);
var _y  = camera_get_view_y(view_camera[0]);
var _w  = camera_get_view_width(view_camera[0]);
var _h  = camera_get_view_height(view_camera[0]);
instance_deactivate_region(_x, _y, _w, _h, false, true);  // outside, notme

// Reactivation — identical args
instance_activate_region(_x, _y, _w, _h, false);

// Or unconditional recovery on level reset
instance_activate_all();

Cache the four values. Pass to both calls. The inside flag must match too.

Verifying

Walk away from a region; instances deactivate. Walk back; same instances reactivate. Without the cache: some never come back, run no events, but stay in memory.

“Same args both calls. Or activate_all. No zombies.”

Related Issues

For tilemap cache, see tilemap cache. For surface lost, see surface lost.

Cache args. Pair calls. All come back.