You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Psychtoolbox Flip时长异常:无法实现16ms图像显示

问题描述

我正在使用Psychtoolbox开展心理物理学任务,需将每张图像分别显示16、30、60、120毫秒。我的显示器刷新率为16.66ms(60Hz),但通过录屏验证发现,图像最低显示时长约为33ms。我已查阅大量资料,尝试通过ifi与nextFrameInterval参数设置Screen('Flip')的触发时间,但仍无法实现16ms的图像显示。请问该问题的原因是什么?如何解决?

代码如下:

ifi = Screen('GetFlipInterval',window);

Screen('DrawTexture',window,fixation,[],fixRect);
[~,lastVisualInterval] = Screen('Flip', window);

nextStimFrameDelta= (p.pre_mask_time/ifi);
Screen('DrawTexture',window,stimulus(rec(TrialNum, 3)),[],rectStim);
[~,lastVisualInterval] = Screen('Flip', window,lastVisualInterval +((nextStimFrameDelta-0.5)*ifi));

nextStimFrameDelta= ((rec(TrialNum,2)/1000)/ifi)  % rec(TrialNum,2) is the duration of presenting images (16,30,... ms)
Screen('DrawTexture',window,mask(TrialNum),[],rectStim);
[~,lastVisualInterval] = Screen('Flip', window,lastVisualInterval +((nextStimFrameDelta-0.5)*ifi));
% And here the facial expression must be replaced by a mask after 16 or 30,... ms 
问题原因
  • 显示器刷新机制限制:60Hz显示器的单帧刷新周期为16.66ms,图像实际显示时长只能是该周期的整数倍。你要实现的16ms本质是让图像停留1个刷新周期,但当前代码的Flip时机计算错误,导致图像被显示了2个周期(约33ms)。
  • 代码时间计算逻辑错误:代码中使用-0.5*ifi的偏移调整Flip时间,这个偏移会打乱垂直同步的时间点,导致Flip触发时机延后到下一帧;同时,从绘制刺激到调用Flip的间隔如果超过半个刷新周期,系统会自动将Flip延后到下一次垂直同步,进而多显示一帧。
  • 录屏工具的精度局限:多数录屏软件的捕获帧率低于显示器刷新率,或者无法精确捕捉单帧的短暂显示,会把1个刷新周期的显示错误识别为2帧(33ms),不能作为精确验证的依据。
解决方法
  • 修正Flip时机计算逻辑:直接基于上一次Screen('Flip')返回的垂直同步时间戳,累加1个ifi来触发下一次Flip,确保刺激只显示1个刷新周期。去掉不必要的-0.5*ifi偏移,因为Screen('Flip')的返回时间本身就是垂直同步的精确时间点。
    修正后的核心代码示例:
    ifi = Screen('GetFlipInterval',window);
    
    % 显示注视点
    Screen('DrawTexture',window,fixation,[],fixRect);
    [~,lastFlipTime] = Screen('Flip', window);
    
    % 等待预遮罩时间(按原逻辑处理)
    lastFlipTime = lastFlipTime + p.pre_mask_time;
    Screen('DrawTexture',window,stimulus(rec(TrialNum, 3)),[],rectStim);
    [~,stimFlipTime] = Screen('Flip', window, lastFlipTime);
    
    % 刺激显示1个刷新周期后(约16.66ms)显示遮罩
    Screen('DrawTexture',window,mask(TrialNum),[],rectStim);
    [~,lastFlipTime] = Screen('Flip', window, stimFlipTime + ifi);
    
  • 使用专业方法验证显示时长:放弃录屏验证,改用两种标准方式:
    • 用Screen('Flip')返回的时间戳计算实际显示时长:actualDuration = maskFlipTime - stimFlipTime,这个值应该接近16.66ms;
    • 用光电二极管(photodiode)贴在显示器显示区域,连接到数据采集设备,记录光信号的持续时间,这是心理物理学实验中验证显示时长的金标准。
  • 启用Psychtoolbox高精度模式:在脚本开头添加以下代码,确保系统启用垂直同步和高精度计时:
    PsychDefaultSetup(2); % 启用高精度实验设置
    Screen('Preference', 'SkipSyncTests', 0); % 不跳过同步测试,确保垂直同步正常工作
    

内容的提问来源于stack exchange,提问作者Helia Taghavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:20:59