try to optimize your events. there's a lot of stuff that can be done easier and it just needs proper thinking.
i've found one optimization in my code when i was doing pathfinding - instead of pathfinding for every object i've added it to family of those objects (one object can be in more families) and set stuff through pathfinding, but since my obstacles move so does map need to be regenerated, if you do that on each tick it's very very costly in performance, so in my example i put every 0.2 sec - which works good and sprites don't get stuck.
also you can include calculating collisions for your visible window. if your layer is 10k x10k and your window is 1000x1000, you don't need collisions on other then 1000x1000. (use Is on-screen condition) . also through instance variables i control where each instance moves, (foreach enemy on screen i take his x var and find path to it and move along ) - there's really a lot of lot of optimizations to do to improve your speed.
also try disabling collisions on all objects that don't need collision (like background sprites, static sprites that are never touched and are just aestethicly there, and others)
also use overlapping instead on collision. (i herd it helps)