I tried it every second, all offset from each other, and still couldn't get ahead of the curve.
You could possibly do the depth change in an alarm for non moving objects, like every quater second...
I don't know, since you are using the draw event to draw your object anyway, you should have this in the draw event so one less event to trigger (if you are using the step event).
Non moving objects then have not code in any other event but the draw. One less cpu drain.
You can also have an alarm every quarter second, even every second depending on how fast the player moves, to turn the visibility to false if it's beyond the fog.
visible = point_distance3d(x,y,z,cam.x,cam.y,cam.z) < cam.FogDistance+100)
alarm = room_speed
in the draw
depth = point_distance3d(x,y,z,cam.x,cam.y,cam.z) < cam.FogDistance+100)
The cost of the point distance should not be much compared to the cost of the 3d translations and actual draw
You may skip a beat once in a while but many comercial games do...