跳至内容

MATLAB 编程/Psychtoolbox/OS X 常见问题解答

来自维基教科书,开放书籍,共建世界
Back to MATLAB Programming/Psychtoolbox

本节包含一些关于 OSX 实现细节的问题。作为维基百科,鼓励您将您的问题添加到这些问题中,并将您的见解添加到这些答案中...

常见问题解答

[编辑 | 编辑源代码]

问:纹理、窗口和屏幕之间有什么区别?

答:屏幕对应于物理连接的显示设备。屏幕 0 是带有 Dock 和菜单栏的显示器。屏幕 1(在双显示器系统上)是第二个显示器,依此类推... Screen('Screens') 命令返回所有可用屏幕的向量 - 可用、已连接且已开启的显示设备。如果您有一个双显示器设置,其显示器切换到镜像模式(两个显示器显示相同的内容),那么在 PTB 中将显示为单个屏幕。屏幕编号只是定义您要在哪个物理输出设备上打开/显示您的刺激窗口。

屏幕窗口用于显示您的刺激。每个屏幕只能有一个全屏屏幕窗口 - 或根本没有 PTB 窗口。所有绘图命令都需要屏幕窗口的句柄,以便它们知道在哪里绘制。

屏幕窗口是双缓冲的:它们由一个后台缓冲区和一个前台缓冲区组成。后台缓冲区是执行所有绘制操作的地方 - 您在此处构建/准备要呈现的刺激。前台缓冲区由您的显示器扫描输出并显示 - 您的投影仪、平板显示器或 CRT 在显示器刷新间隔内。

在完成绘制并将您的刺激图像准备好在后台缓冲区后,您将发出 Screen('Flip',...) 命令。此命令要求 PTB 在您的显示设备的下一个垂直回扫时切换前台和后台缓冲区的角色。这样,以前的后台缓冲区就变成了新的前台缓冲区,并且您的新刺激将显示给受试者。以前的前台缓冲区成为新的后台缓冲区,并准备好绘制下一个刺激。由于缓冲区交换与垂直回扫同步,并且始终在不到 1 微秒的时间内完成,因此您将获得完美的、无闪烁、无撕裂的刺激呈现时间,无论绘制需要多长时间 - 除非您试图在时间过短的时间内绘制过于复杂的东西。重要的是,Flip 将绘制(及其时间变化)和实际刺激呈现解耦 - 这在 MacOS-9 和 Win 工具箱中是不可能的。

离屏窗口与自 2006 年以来发布的 Psychtoolbox 中的纹理相同。在内部它们是相同的东西,因此您始终可以在需要使用离屏窗口的地方使用 Psychtoolbox 纹理,以及在需要使用纹理的地方使用离屏窗口。它们在创建和性能方面有所不同:纹理是由 Screen('MakeTexture') 从 Matlab 图像矩阵或由 Quicktime 电影播放引擎或视频捕获引擎自动创建的。创建它们非常快且高效。它们还针对尽可能快的绘制进行了优化。离屏窗口通过调用 Screen('OpenOffscreenWindow') 创建; - 它们使用可选的大小、颜色深度和初始均匀颜色进行初始化,而不是使用图像内容。它们针对快速绘制*到*它们中进行了优化 - 每个 Screen 绘图命令不仅可以绘制到屏幕窗口,还可以绘制到离屏窗口。创建后,它们(几乎)是同义词。

例如。

假设您在 Matlab 中有一个图像矩阵 I,例如,通过 I=imread('myimage.png') 创建

那么

tex=Screen('MakeTexture', win, I);

tex=Screen('OpenOffscreenWindow', win); Screen('PutImage', tex, I);

相同,只是前者比后者快得多。优点还在于,Screen('DrawTexture') 命令允许在绘制时缩放、放大、过滤和旋转纹理,纹理绘制非常快,因为它使用了图形卡上的专用硬件,以及更多...

问:如何创建离屏窗口的副本?

答:您首先要创建一个与原始离屏窗口大小和颜色深度相同的空离屏窗口,然后将原始窗口的内容复制到新窗口中

让 origWin 是您想要复制的离屏窗口,然后

duplicateWin = Screen('OpenOffscreenWindow', origWin); Screen('CopyWindow', origWin, duplicateWin);

-> duplicateWin 是 origWin 的副本。

问:有没有简单的方法可以为所有窗口/屏幕设置 TextSize(或其他类似参数)?

答:没有。您必须通过 Screen('TextSize', win, ...) 命令为每个窗口设置它。但考虑到大多数人最多只有两个窗口,这并不算太多工作。

问:'OpenOffScreenWindow' 窗口可以有多个缓冲区吗?

答:不。拥有多个缓冲区没有意义。

华夏公益教科书