I would do this using a setTimeout, so it only gets executed once per batch of signals. A lot of ops will fire cursor moved and then paragraph changed signals, but you only need to re-render once afterwards.

Will also be a major performance only do this once every 50/100ms for remote cursors.