Inconsistencies in canvas.show() completion time
Hello everybody,
I am trying to animate a rectangle that shrinks, indicating how much time a participant has to answer a question. I've built it based on a previous post of mine (link: https://forum.cogsci.nl/discussion/6908/animation-while-waiting-for-keyboard-input#latest) and it works quite well, apart from a single thing:
The way I make the time bar shrink is by drawing a black rectangle once, and "drawing" a white rectangle on top of it whose x-coordinate is slightly more to the left each iteration. See code below of how I do it:
This works fine 90% of the time, but once every while canvas.show() takes a lot longer to complete. To illustrate this I print out the "percentage_timer", which is calculated to know how much the white bar x-coordinate needs to be moved. It represents how many percent of the initial black bar will be covered by the white rectangle.
As you can see from the numbers above, a lot of the time it works correctly and an increase of about 0.3% is used, making the shrinking of the black bar run smoothly. Sometimes however I get the warning that canvas.show() took a long time to complete, resulting in an increase of 4% for "percentage_timer" instead of the usual 0.3%. Note that the time varies wildly (here from 18 to 95 milliseconds, but I have also had 190+ milliseconds). As the while loop is always the same, this should not occur normally.
My question is the following: what could be the cause of this, how can I find the cause, how can I fix it?
I have stopped as many programs as possible that ran on my computer (chrome, spotify, ...), but this did not help.
Thanks in advance for any answer!
Comments
Hi @gvh ,
When you change the x coordinate, the stimuli need to be prepared again, which can take some time. However, this would result in a delay when changing the x coordinate, whereas in your case the delay is in the
show()
itself. And it's also much larger than you'd reasonably expect. This is a bit odd.It will be difficult to figure out exactly why this happens; in very general terms it likely has something to do with the way that stimuli are rendered at the level of OpenGL, which is the software library used by PsychoPy and Expyriment to present stimuli.
You can see what happens if you change the backend. I suspect that the animation will be smooth with the legacy backend, but this will come at the cost of other suboptimalities, notably a lack of synchronization to the vertical refresh. You can read more about that here:
— Sebastiaan
Check out SigmundAI.eu for our OpenSesame AI assistant!
Dear @sebastiaan ,
Thanks for the reply!
I figured that it is a rather complex issue somewhere in the backend of the program. I've tried all backends (I was currently using psychopy as backend) and sadly psychopy had the best performance by far. When changing to the psychopy backend the "refresh rate" (if it can be called so) was significantly lower and the animation was far from smooth.
I don't think that an easy fix or answer is possible here.