cache
do not redraw what's unnecessary
reduce computation