And I did another test, add below line, to show out which pixels in bg img read. (only the white sector zone).
scene.backgroundImage().setPixel(u * zmul, v * zmul,1)
So for 160*80 times getPixel() are all against this small zone, many many times are reading the same dot. So I guess it could be a way to optimize by replacing getPixel() with getRows().
I have no time to do it today, maybe tomorrow.