Improve performance of tile map rendering

I am writing a custom tilemap renderer and face a bottleneck when my layer contains more than 5000 tiles: when I drag the map around, I see significant FPS drop (60 -> 25). 

Since I am using nothing more than display.newImage() and display.newGroup(), I am thinking there are ways to improve this massively.

So far, I find saving tile layers into static image to be most effective methods (especially for ground layer, where we have largest number of tiles). But it also means we lose access to those tiles, and have to rebuild the image anytime the map changes.

I have read tutorial and guide on Snapshot , but it uses so much more memory than my static image approach, said tutorial also discourages creating snapshot for a whole layer.

Is there another way to somehow cache map layers (which are display groups) using application code? so that when I drag the map, Corona doesn’t have to move each children, but just move the canvas as a whole?

Worse still, I have no idea how Snapshot positioning works , I use anchorX/Y = 0 as my global display default, but Snapshot object doesn’t seem to obey the same rule of either Container or Group object.

EDIT: I think I am facing the same behaviour described in this thread, now if any Corona SDK developers can comment on why Snapshot always use 0.5/0.5 origin regardless of the anchorX/Y value , that would be great.

I should note I have searched for a long time on this topic, yet to come across a thread with clear answers (that’s up-to-date with current API). Most threads end up with no replies or partial suggestions, shall we make this one counts? Or at least, point me to something more detailed than the current guide/tutorial, which frankly doesn’t fully explain how to master the snapshot.

Worse still, I have no idea how Snapshot positioning works , I use anchorX/Y = 0 as my global display default, but Snapshot object doesn’t seem to obey the same rule of either Container or Group object.

EDIT: I think I am facing the same behaviour described in this thread, now if any Corona SDK developers can comment on why Snapshot always use 0.5/0.5 origin regardless of the anchorX/Y value , that would be great.

I should note I have searched for a long time on this topic, yet to come across a thread with clear answers (that’s up-to-date with current API). Most threads end up with no replies or partial suggestions, shall we make this one counts? Or at least, point me to something more detailed than the current guide/tutorial, which frankly doesn’t fully explain how to master the snapshot.