It would help if you'd upload the .ged + data instead of an exe. That way we could actually have a look at what you're doing and suggest a better solution.
However, I see what you're doing with your idea of controlling VisibilityState, but there is one thing you may have not considered. Your system of showing and hiding the tiles uses a lot of resources, because every frame all these events are processed for every single block:
- Collision check with visible_area
- Collision Finish check with visible_area
- Draw Actor event
Now, when you think what this means, it's that every frame the game needs to do all this for each of your 11214 blocks. And that simply takes a lot time.
How are you generating the level? The best solution would be to instead of creating 11214 clones, to just make an array of the level in which you'd store the contents of the level. Then you could use an algorithm to find the tiles that need to be shown on the screen, and show just those tiles.
In general you should always try to avoid putting code into a Draw Actor event of an actor you know you'll be cloning that many times.
If you need help with realizing my suggestion, I'm willing to help you.