パソコンで呈示できる最も短い時間
例えば、プライミングの実験などで、非常に短い時間なにかを画面に呈示したいとします。さて、あなたのパソコンで、どれくらい短い時間、刺激を呈示できるでしょうか?
100ms? 50ms? それとも10ms?
もしかすると、刺激の呈示時間を、10ms, 11ms, 12ms・・・と1ms単位で変更して、その効果を検討したい! なんてこともあるかもしれません。そういうときは、まず、モニター(ディスプレイ)のリフレッシュレート(フレームレート)について知る必要があります。
Windowsでリフレッシュレートの確認
現在のリフレッシュレートが確認できます。リフレッシュレートを変更したい場合には、「ディスプレイのアダプターのプロパティを表示します」をクリック。ですが、液晶ディスプレイの場合は、60Hzから変更できないことが多いようです。
Macでのリフレッシュレートの確認
Windowsと同じく、接続しているモニターによってはリフレッシュレートを変更できないかもしれません。
win.flip()
次の図は、リフレッシュレートが60Hzの場合を例にとり、PsychoPyの関数であるwin.flip()
との関係を示したものです。
冒頭でお話しした
刺激の呈示時間を、10ms, 11ms, 12ms・・・と1ms単位で変更して、その効果を検討する
という実験は、残念ながら普通のパソコンで行うことはできないのです。リフレッシュレートが60Hzの場合は、呈示時間の短い順に、16.7ms, 33.4ms(=16.7x2), 50.1ms(=16.7x3)・・・でしか、呈示時間を変更することができないので注意してください。
同様に、リフレッシュレートが100Hzの環境では、呈示時間の短い順に、10ms, 20ms, 30ms・・・となります。
win.flip()は画面が書き換わるタイミングに自動で同期します
上の図でも触れていますが、PsychoPyの関数win.flip()
は、画面が書き換わるタイミングに自動で同期して実行されます。
どういうことか、下のコードで確認してみましょう。CodeコンポーネントのBegin Experimentに記述してください。
# 次の関数も参照してください。
# win.fps(), win.getActualFrameRate(), win.getFutureFlipTime()
print(win.monitorFramePeriod) # 60Hzのとき約0.0167s
myText = visual.TextStim(win=win)
for i in range(100): # 0から99
myText.text = str(i)
myText.draw()
win.flip()
このコードでは、0から99までの数字を画面に呈示します。for文でflipを100回呼び出していますね。では、画面上の数字はいったい何秒の間隔で書き換わるのでしょうか?
実際にプログラムを動かすと、かなり高速で数字が書き換わっているのが分かると思います。どれくらいのスピードで書き換わっているのかは、使っているパソコンのリフレッシュレートに依存します。
win.flip()
が画面が書き換わるタイミングに自動で同期することを思い出してください。もしリフレッシュレートが60Hzの場合は、flip(画面の書き換え)は約16.7msごとに行われています。
また、PsychoPyのプログラムでは、win.monitorFramePeriod
で1フレームの時間を知ることができます。単位は秒です。フレームレートもwin.getActualFrameRate()
やwin.getFutureFlipTime()
で知ることができます。詳細は公式サイトで確認してください。
呈示時間を実測することが望ましい
すでに説明した通りwin.flip()
は、画面が書き換わるタイミングに自動で同期して実行されることになっていますが、それが本当に行われているかは実測してみないと分かりません。オシロスコープとフォトセンサー(フォトダイオード)があれば、測定することができます。もしくは予算があれば、Black Box Toolkitがお勧めです。
公式サイトのPresenting Stimuli -> Timingもあわせてご参照ください。