So I’m using a linux machine and scripts running on this PC usually have visual.window set with waitBlanking=False to fix the double-the-time per frame issue that occurs on Ubuntu.
I recently needed to track the flip time in a particular script but in doing so, it produces a NaN/None value. Took me a while to locate the source of this problem. Only when setting waitBlanking=True will then a value be generated. Any clue as to how to get this to work?
The following codes are enough to replicate this error:
from psychopy import visual, event, core, data
window =visual.Window(size=(1152,864), screen = 0, allowGUI=False,
bitsMode=None, units='pix', waitBlanking=False, winType='pyglet')
gaze_dot =visual.GratingStim(window,tex=None, mask="gauss",
pos=(0,0 ),size=(80,80),color='green',
units='pix')
for x in range(200):
gaze_dot.draw()
window.flip()
fliptime = window.flip()
print fliptime
Ah, yes, the code to return the flip time apparently only occurs if waitBlanking is True. We could change that without causing any damage to existing code I think (the logic would be that flip times on most machines are only accurate with waitBlanking turned on but this is a good example of not doing that).
Workarounds:
you could change the Window.flip() function yourself in your copy of psychopy so that return now is always executed
you could also workaround this by setting win.recordFrameInervals = True (as in the time by frames demo) and then printing out win.frameIntervals. That setting and attribute are valid even with waitBlanking=False
Thanks Jon. I take it that there is no other way to record the win.flip() based on the core.clock system rather than win.frameIntervals method (which prints out a list of 0.166… [ms per frame for my 60hz monitor])? The downside to using win.recordFrameIntervals is that it doesn’t account for time of the experiment/script when no flips were executed, which is what I primarily needed - to be able to track real time when a flip occured.
Also, I tried changing the win.flip function via the source code to the following but I’m still getting None value when calling for the time:
#If self.waitBlanking is True, then return the time that
# GL.glFinish() returned, set as the 'now' variable. Otherwise
# return None as before
#
if self.waitBlanking is True:
return now
else:
return now