首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PsychToolBox教程中解释一行代码

从PsychToolBox教程中解释一行代码
EN

Stack Overflow用户
提问于 2016-06-24 13:43:06
回答 2查看 923关注 0票数 2

我正在学习PsychToolBox,并参考本教程。http://peterscarfe.com/movingdotgriddemo.html

有这样一条线:

代码语言:javascript
复制
vbl  = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi); 

我搞不懂。谁能给我解释一下吗?尤其是vbl + (waitframes - 0.5) * ifi)部分。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-11 09:42:21

亚历克斯说的一切都是正确的;我只是给-0.5加一个解释(我没有足够的声誉来评论他的回答)。

回顾一下:在每个循环/帧上,您翻转屏幕缓冲区并在vbl变量中获取翻转时间。在下一个循环中,您根据最后一个循环(即vbl + [some number of seconds] )对下一个翻转进行计时。因此,您的代码行在函数调用中使用了前面的vbl值,并将其设置为函数返回的新值。vbl是滚动更新的。vbl是“垂直消隐”时间,是对显示器实际刷新时间的一个非常准确的估计*,因此将帧对齐是个好主意。

问题是,从最后一个vbl到下一个翻转还有多远。正如亚历克斯所说,ifi是刷新或1/[your monitor refresh rate in Hz]之间的时间。现在让我们忽略waitframes,假设您希望打开每次监视器刷新,即waitframes = 1

然后,您的代码行简化为

代码语言:javascript
复制
vbl  = Screen('Flip', window, vbl + ifi/2);

因此,我们要求在下一次刷新前翻转半个ifi。为什么不直接要求翻转下一次刷新,即vbl + ifi**?**,因为该和是浮点计算,并且可能包含小的舍入错误。Screen('Flip')只能在下一次监视器刷新时交换屏幕缓冲区,那么如果该总和中的错误稍微超出了值,会发生什么情况?然后,您只需要一个翻转时间稍微超过您实际希望的监视器刷新,PTB必须等待几乎整个ifi才能真正翻转**。

因此,我们要求在所需的监视器刷新( ifi/2是合理的)之前有一个翻转时间(小于ifi)。我们真正说的是“在vbl+ifi/2之后尽快做下一次翻转”,知道Screen('Flip')在刷新之前实际上不能做到这一点,并且知道我们有ifi/2的回旋余地来吸收时间计算中的小错误。

waitframes算法是留给读者的练习。

*假设PTB设置正确,以便与您的硬件保持良好关系--注意那些警告信息!

**更糟糕的是,这可能不会出现在PTB的错误中,例如丢弃的帧计数,因为PTB已经实现了您要求的结果:在下一次监视器刷新时从您指定的时间翻转缓冲区。在这种情况下,你知道你的实验滞后的唯一方法是,如果你在运行时碰巧发现了它,就会出现不定时的刺激!

票数 3
EN

Stack Overflow用户

发布于 2016-06-25 11:28:41

LHS (左手边)上的vbl是一个变量,屏幕“翻转”的时间存储在这个变量中。

RHS是来自PTB的命令,告诉窗口翻转屏幕(‘flip’,window) - vbl +(等待帧- 0.5)*ifi是翻转指令中的一个附加参数,告诉计算机等待那一刻翻转屏幕。即屏幕(“倒立”,窗口,when)

在这种情况下,屏幕将翻转(等待帧- 0.5)*ifi秒后翻盖( vbl +.)比特。因为ifi是帧间间隔(屏幕连续刷新之间的时间),所以我们可以简单地说vbl + ifi,它将在每次刷新时翻转屏幕,但是,我们在其中添加了(等待帧- 0.5)乘法器,以便我们可以指定在再次翻转屏幕之前应该等待多少刷新。我从来没有真正理解-0.5部分的逻辑,所以我想看看是否有人能回答这个问题。

无论如何,在翻转屏幕之后,它可以节省屏幕翻转的时间,以便下一次翻转命令可以使用该时间戳来指定下一次翻转的发生时间(vbl+(等待帧-0.5)*ifi)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38014908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档