Question about DotStim speed: observed displacement seems twice the configured value

Hello PsychoPy team,

I am trying to reproduce a Random Dot Kinematogram originally implemented in PsychoPy in another experimental platform, and I have come across a behaviour that I cannot explain.

In my PsychoPy script, I use:


dots = visual.DotStim(
    win,
    units='deg',
    speed=0.07,
    ...
)

According to the documentation, speed is expressed in units/frame, so I would expect the dots to move by approximately 0.07 deg per displayed frame.

To verify this, I instrumented the script to record the position of one dot on every frame and computed its displacement between consecutive frames (excluding reinsertion events).

The experiment reports:

  • Configured speed: 0.0700 deg/frame
  • Measured refresh rate: ~60.1 Hz
  • Median measured displacement: ~0.1400 deg/frame
  • Corresponding speed: ~8.4 deg/s

This is approximately twice the expected displacement (0.07 × 60 ≈ 4.2 deg/s).

While looking through the source code, I noticed that draw() calls _update_dotsXY(), and that _drawLegacyGL() also appears to call _update_dotsXY() when USE_LEGACY_GL is active. This made me wonder whether the positions could be updated twice under some rendering paths, although I may be misunderstanding the rendering pipeline.

Could you clarify whether:

  1. speed is expected to correspond exactly to the displacement between two displayed frames?
  2. Is there any rendering path (e.g., Legacy OpenGL) where the effective displacement can differ from the configured speed?
  3. Alternatively, am I likely measuring the wrong internal quantity by tracking dots._dotsXY?

Thank you very much for your time.

Best regards,