listeners only need to tick once per frame