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.