I wrap coords. I have offset variable which points to the tile in top-left corner of the view.
Assume i have visible area from 0,0 to 19,19 (size is 20,20).
Now I move x+1, so column 0 becomes invisible, but column 21 appears. View is 1,0 to 20, 19 now.
I don't need column 0 anymore, so i perform modulus on column 20: 20 % 20 = 0. Now i can insert column 20 into space left by column 0.
I made benchmark:
Visible area is 107 x 63 (16px tiles). Refresh indicates time spend on refreshing vertex array, Draw indicates time spend on drawing it. Refreshing one row or column has overhead less than 10% (compared to just drawing raw vertices). If we are moving very fast (9600 pixels per second) Overhead is around 50%. There are 53928 vertices in the array (two layers of quads).