multi-thread + onFrame