So, there's a few tricks to getting multiple canvases to work right when they overlap.
First, you don't want to be altering multiple canvases in the visual stack. That is, if you have two or three canvas objects that overlap, you only want to be changing layers on the "top" one. That's because adding to a canvas and calling show() incurs the normal delay of re-compositing that canvas. If there's lots of images, or very large images, it may take a bit to update, and it's hard to determine how long. The call to .show on any canvas items "above" it need to happen after it finishes. Calling show() on a canvas item that has NOT been changed is quite quick though, somewhere between 11 and 40 ms.
Second, you need to call show() on all canvas objects that overlap, in order, on each update to the topmost canvas in that stack. As long as the lower canvas objects aren't changing, this shouldn't be too much of a problem, as caling show() on them is quite speedy.
So, it's dirty, it's a hack, it's painful to do, but if you do it right, in some circumstances you can get a fairly static update time out of canvas operations, which can't be (currently) said for a single canvas.
-- GandK Labs
Check out Reversi! in the channel store!