0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

リフレッシュ(フレーム)レートとPsychoPyのwin.flip()

Last updated at Posted at 2019-09-24

パソコンで呈示できる最も短い時間

例えば、プライミングの実験などで、非常に短い時間なにかを画面に呈示したいとします。さて、あなたのパソコンで、どれくらい短い時間、刺激を呈示できるでしょうか?

100ms? 50ms? それとも10ms?

もしかすると、刺激の呈示時間を、10ms, 11ms, 12ms・・・と1ms単位で変更して、その効果を検討したい! なんてこともあるかもしれません。そういうときは、まず、モニター(ディスプレイ)のリフレッシュレート(フレームレート)について知る必要があります。

Windowsでリフレッシュレートの確認

ディスプレイの設定を開きます。
win_display1.png

win_display2.png

現在のリフレッシュレートが確認できます。リフレッシュレートを変更したい場合には、「ディスプレイのアダプターのプロパティを表示します」をクリック。ですが、液晶ディスプレイの場合は、60Hzから変更できないことが多いようです。

ディスプレイ設定3.png

Macでのリフレッシュレートの確認

システム環境設定からディスプレイを選択
スクリーンショット 2019-09-24 15.48.44.png
スクリーンショット 2019-09-24 15.48.57.png

Windowsと同じく、接続しているモニターによってはリフレッシュレートを変更できないかもしれません。

win.flip()

次の図は、リフレッシュレートが60Hzの場合を例にとり、PsychoPyの関数であるwin.flip()との関係を示したものです。
リフレッシュレート.jpg

冒頭でお話しした

刺激の呈示時間を、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に記述してください。

BeginExperiment
# 次の関数も参照してください。
# 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もあわせてご参照ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?