[ ] The idea was to reduce calls to drawImage as much as possible. So don't draw what's already been drawn. I rendered the viewport only once, then as you move/pan around, you calculate an offset, copy the canvas to a second (invisible) canvas with that offset. There you just have to fill in the blanks (at the edges), and copy everything back to the main canvas.