備份自:http://blog.rainy.im/2015/05/01/psychtoolbox-3-accurate-timing-1/
Psychtoolbox 3 中一些基本概念與基本原理的介紹咧栗,重點(diǎn)總結(jié)精確到幀的呈現(xiàn)時間的控制與精確的鍵盤(鼠標(biāo))輸入時間的控制。
1. Textures, Windows, Screens 等基本概念
PTB 中 screen 指代顯示器,Screen 0 代表默認(rèn)顯示器戚宦,Screen 1 代表雙屏系統(tǒng)中第二個顯示器桨踪,以此類推伪节。Screen('Screens')
返回可用顯示器的列表吼砂。
PTB 中 (onscreen) window 是用來展示實(shí)驗(yàn)刺激的顷帖,一個顯示器(screen)最多只能有一個全屏顯示的 window美旧。所有的繪制操作都在 window 中執(zhí)行。window 都是雙緩沖的贬墩,也就是包含了后緩沖區(qū)(backbuffer)和前緩沖區(qū)(frontbuffer)兩部分榴嗅。如果把顯示器看作是一個舞臺,后緩沖區(qū)相當(dāng)于舞臺的后臺陶舞,將要繪制的圖形在這里完成準(zhǔn)備工作嗽测;而前緩沖區(qū)相當(dāng)于看得見的舞臺部分,也就是顯示器呈現(xiàn)刺激的部分,如一般實(shí)驗(yàn)室采用的 CRT 顯示器唠粥,在前緩沖區(qū)中陰極射線管通過掃描完成一次成像疏魏。當(dāng)我們通過一些繪制指令(如Screen('DrawTexture',...)
)完成繪制的準(zhǔn)備工作后,需要通過調(diào)用Screen('Flip',...)
指令晤愧,完成前后緩沖區(qū)的切換大莫,同時保證這一切換過程(一般1ms之內(nèi)即可完成)發(fā)生在兩次(幀)掃描的間隔(也就是電子槍回溯到屏幕左上角的時間段),避免造成成像斷裂等現(xiàn)象官份。Flip
指令最重要的功能是將圖像繪制過程與實(shí)際呈現(xiàn)過程分離只厘。
(offscreen) window 就是之前版本中的 Texture,唯一的不同是指令名稱和執(zhí)行效率舅巷。細(xì)微的差別就不再贅述羔味。
2. Flip 指令
Screen('Flip?') % 可以通過 Screen('Func?')進(jìn)行查詢該指令的說明文檔
Usage:
[VBLTimestamp StimulusOnsetTime FlipTimestamp Missed Beampos]
= Screen('Flip', windowPtr [, when] [, dontclear] [, dontsync] [, multiflip]);
Flip 指令返回的第一個值 VBLTimestamp
是指上一幀掃描結(jié)束的時間點(diǎn),接下來陰極射線管的電子槍需要回到屏幕左上角進(jìn)行下一幀的掃描钠右,這一間隔稱為垂直空白間隙(vertical blank interval, VBL)赋元。同時前后緩沖區(qū)的切換也從這一時間點(diǎn)開始。此時 PTB 會進(jìn)入休眠狀態(tài)飒房,一直等到切換過程結(jié)束才會重新請求 CPU 資源们陆,在這期間 CPU 可以保證系統(tǒng)其它部分的正常運(yùn)行。等到切換完成之后情屹,PTB 立即執(zhí)行下面兩件事:
- 查詢電子槍(beam)當(dāng)前的位置,并返回給變量
Beampos
杂腰; - 通過
GetSecs()
查詢當(dāng)前精確的時間戳垃你。
一般的多任務(wù)操作系統(tǒng)(OS X & Windows),在具體事件的時間點(diǎn)上都可能存在非常細(xì)微的隨機(jī)誤差喂很,例如 VBL 開始的時間(VBLTimestamp
)惜颇、PTB 重新占用 CPU 的時間,一般這一時間差不會超過 1ms少辣,但偶爾也有可能出現(xiàn)幾毫秒的誤差凌摄。為了補(bǔ)償這一誤差,PTB 利用電子槍回溯的位置作為另外一個高分辨率的時鐘進(jìn)行精確時間的控制漓帅,其計(jì)算的原理如下圖所示:
Flip 返回的第二個值 StimulusOnsetTime
代表第二幀開始進(jìn)行掃描的時間锨亏,即:StimulusOnsetTime = VBLTimestamp + VBL
。
Beamposition 的查詢必須依賴于顯卡硬件的支持忙干,當(dāng)無法通過硬件查詢準(zhǔn)確的 Beamposition 時器予,也就無法獲取 VBL 時間。這時 PTB 一般會報(bào)錯:
----- ! PTB - ERROR: SYNCHRONIZATION FAILURE ! ----
One or more internal checks (see Warnings above) indicate that synchronization of Psychtoolbox to the vertical retrace (VBL) is not working on your setup.
如果對時間精確度的要求不是那么嚴(yán)格捐迫,或者程序還在調(diào)試階段乾翔,可以通過Screen('Preference', 'SkipSyncTests', 1)
跳過這一錯誤。此時施戴,F(xiàn)lip 指令返回 StimulusOnsetTime = VBLTimestamp; beampos = -1;
反浓。
3. Accurate Timing Demo
了解了以上原理萌丈,再來看精確時間控制的Demo:
首先是最簡單隨意的呈現(xiàn)方式,這樣無法保證精確控制時間雷则,只是為了與后面的方法進(jìn)行比較:
for frame = 1:numFrames
% Color the screen red
Screen('FillRect', window, [0.5 0.5 0.5]);
% Flip to the screen
Screen('Flip', window);
end
上一例子中沒有明確給出 Flip 執(zhí)行的時間辆雾,這導(dǎo)致我們無法精確控制刺激呈現(xiàn)的時間。下面的例子中巧婶,首先在后緩沖區(qū)準(zhǔn)備繪制之前讀取前一幀結(jié)束的時間vbl
乾颁,然后在連續(xù)呈現(xiàn)numFrames
幀刺激的過程中,明確指定每一次 Flip 的時間為上一幀掃描結(jié)束后的(waitframes - 0.5)*ifi
艺栈。當(dāng)waitframes = 1;
時英岭,前后兩次 Flip 之間的間隔一定為IFI,也就是連續(xù)呈現(xiàn)兩幀湿右,從而確保刺激呈現(xiàn)的時間為兩幀诅妹。
waitframes = 1;
vbl = Screen('Flip', window);
for frame = 1:numFrames
% Color the screen red
Screen('FillRect', window, [0.5 0 0]);
% Flip to the screen
vbl = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi);
end
上一例子中我們希望 PTB 可以在連續(xù)兩幀中呈現(xiàn)刺激,以保證刺激呈現(xiàn)時間毅人。但現(xiàn)實(shí)并不一定如此吭狡,因?yàn)橛?jì)算機(jī)操作系統(tǒng)需要同時維持所有軟硬件組成的正常運(yùn)轉(zhuǎn),如鍵盤丈莺、鼠標(biāo)划煮、網(wǎng)絡(luò)連接等等,這就可能導(dǎo)致 CPU 無法及時響應(yīng) PTB 的請求缔俄。為了讓 CPU 優(yōu)先處理 PTB 的請求弛秋,我們需要提高 PTB 的優(yōu)先等級;除此之外俐载,還可以在繪制指令與 Flip 之間插入Screen('DrawingFinished', window);
來阻止其它繪制蟹略,保證更好的時間精確度:
topPriorityLevel = MaxPriority(window);
Priority(topPriorityLevel);
vbl = Screen('Flip', window);
for frame = 1:numFrames
% Color the screen red
Screen('FillRect', window, [0.5 0 0.5]);
% Tell PTB no more drawing commands will be issued until the next flip
Screen('DrawingFinished', window);
% Flip to the screen
vbl = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi);
end
Priority(0);
4. 其它精確時間控制的設(shè)定及方法
對于現(xiàn)代計(jì)算機(jī)硬件來說,基本上可以通過代碼的控制做到精確的時間控制遏佣。如果實(shí)驗(yàn)儀器是一些相對老舊的硬件設(shè)備(例如……)挖炬,可能需要一些額外的系統(tǒng)配置來輔助精確時間的控制。
4.1 系統(tǒng)設(shè)置:
- 退出系統(tǒng)中無用的應(yīng)用程序状婶、后臺服務(wù)等意敛,不要占用過多 CPU;
- 禁用殺毒軟件膛虫;
- 確保有足夠的內(nèi)存空闲,必要時利用虛擬內(nèi)存;
- 確保節(jié)能選項(xiàng)不會減慢 CPU走敌;
- 關(guān)閉藍(lán)牙碴倾、WIFI、網(wǎng)絡(luò)連接以及 CD/DVD 等外接設(shè)備;
- 不要盲目采用過高分辨率跌榔,這樣可能加重顯卡負(fù)擔(dān)异雁,增加處理時間誤差。
4.2 Matlab設(shè)置:
-
matlab -nojvm
模式運(yùn)行(如果沒有必要用到 Java 輔助工具僧须,如GetChar
等)纲刀; - 盡量減少 Matlab 圖形界面窗口;
- 閱讀 Matlab 文檔担平,優(yōu)化代碼示绊,充分利用內(nèi)存加快執(zhí)行速度;
-
help mlint
查看執(zhí)行效率的瓶頸及代碼可能存在的問題暂论。
4.3 程序編寫中需要注意的問題:
- PTB 輸出的 log 信息:
通過 Screen('Preference', 'Verbosity', level);
控制 PTB 執(zhí)行過程中的輸出信息面褐,在程序調(diào)試時可以選擇較高的 level
便于找到問題;正式實(shí)驗(yàn)可以采用 Screen('Preference', 'Verbosity', 0);
禁用所有輸出信息取胎,節(jié)省執(zhí)行時間和資源展哭。
- 函數(shù)的預(yù)加載:
Matlab 中的 .M & .MEX
源文件的加載需要一定的時間,如文件的定位闻蛀、加載匪傍、執(zhí)行等,這一初始化時間可能需要幾百毫秒觉痛,所以在實(shí)驗(yàn)試次開始之前應(yīng)該先執(zhí)行一次需要的函數(shù)役衡。
- 同一源文件內(nèi)的
function
比通過文件加載的function
快:
Matlab 中的function
可以直接在當(dāng)前腳本中定義,也可以通過單獨(dú)的腳本文件定義(函數(shù)名與文件名一致)薪棒,調(diào)試過程中為方便可以將不同的function
切分成獨(dú)立的腳本文件映挂,但在正式實(shí)驗(yàn)時應(yīng)該將必要的function
整合到同一個執(zhí)行腳本。
- 優(yōu)化代碼結(jié)構(gòu):
實(shí)驗(yàn)程序的主體盗尸,trial loop 內(nèi)的代碼應(yīng)該以如下順序執(zhí)行:
% 1. 繪制命令
Screen('DrawDots',...), Screen('DrawText',...),Screen('DrawTexture',...)...
% 2. 阻止多余繪制
Screen('DrawingFinished', win);
% 3. 其它與顯卡操作無關(guān)的代碼,如聲音帽撑、鍵盤泼各、鼠標(biāo)以及其它Matlab邏輯等
KbWait;
% 4. Flip 指令讓預(yù)備繪制刺激登臺
vbl = Screen('Flip', win, vbl+0.5*ifi);
5. 總結(jié)
上述內(nèi)容主要針對 CRT 顯示器,CRT 與 液晶平板(LCD)的原理及優(yōu)劣 Elze (2010)的文章中有詳細(xì)介紹亏拉,文章還總結(jié)了2003-2009三本心理學(xué)雜志中75篇實(shí)驗(yàn)材料呈現(xiàn)時間低于50ms的研究扣蜻,從各個研究中作者給出或推斷的實(shí)驗(yàn)方法來看,許多研究者對顯示器上刺激呈現(xiàn)時間的基本概念與操作還存在一些誤解及塘,導(dǎo)致實(shí)驗(yàn)實(shí)際呈現(xiàn)的時間并非研究者所認(rèn)為的時間莽使。一直以來都有爭議而且最近比較熱鬧的心理學(xué)研究重復(fù)驗(yàn)證,其實(shí)很大程度上與實(shí)驗(yàn)條件控制有關(guān)笙僚,比如有些研究者文章中聲稱研究中刺激呈現(xiàn)時間為50ms芳肌,但是我們并不知道是如何做到的,實(shí)驗(yàn)程序中是否存在不合適的操作等。所以說應(yīng)該建議研究者投稿錄用后把實(shí)驗(yàn)程序開源亿笤,放到 Github 上翎迁,供所有人查看,也大大節(jié)約了重復(fù)實(shí)驗(yàn)的時間成本净薛。哈哈汪榔,但是又有幾個人愿意這樣做呢~
到此為止基本介紹了 PTB 3 中對實(shí)驗(yàn)刺激呈現(xiàn)時間進(jìn)行精確控制的方法以及相關(guān)注意事項(xiàng),在實(shí)驗(yàn)過程中除了準(zhǔn)確地呈現(xiàn)實(shí)驗(yàn)刺激之外肃拜,還需要準(zhǔn)確地記錄被試做出反應(yīng)的時間痴腌,這主要涉及到鍵盤、鼠標(biāo)或者特定的反應(yīng)輸入設(shè)備的精確控制燃领。PTB 3 中如何準(zhǔn)確地處理響應(yīng)輸入呢士聪,下一節(jié)再說吧。
參考:
- FAQ: Textures, Windows, Screens
- FAQ: Performance Tuning
- Accurate Timing Demo
- Elze, T. (2010). Misspecifications of stimulus presentation durations in experimental psychology: A systematic review of the psychophysics literature. PloS one, 5(9), e12792.