问题标签 [shady]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
66 浏览

python - 在 Shady 中呈现预先准备好的图像数组的一部分

我有兴趣从 psychtoolbox 迁移到shady以进行刺激演示。我查看了在线文档,但我不太清楚如何复制我目前在 matlab 中所做的事情。

我所做的其实很简单。对于每次试验,

  1. 我从磁盘加载单个图像(我离线进行亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激为 1000x1000 像素,我呈现 25 帧,因此图像为 5000x5000 像素。我只使用 BW 图像,所以我每个像素有一个 int8 值)。

  2. 我将整个图像从 CPU 传输到 GPU

  3. 在某些时候(外部控制)我将第一帧复制到视频缓冲区并呈现它

  4. 在其他某个点(外部控制),我触发剩余 24 帧的显示(将图像的相关部分复制到每个视频帧的视频缓冲区,然后调用翻转())。

  5. 外部控制是通过让另一台机器通过 TCP/IP 与刺激呈现代码进行通信来实现的。在控制PC向演示PC发送命令并执行后,演示PC需要向控制PC发送回确认消息。我需要发送三个 ACK​​ 消息,一个当屏幕上出现第一帧时,一个当屏幕上出现第二帧时,一个当屏幕上出现第 25 帧时(这样控制 PC 可以轻松验证是否丢帧)。在 matlab 中,我通过调用阻塞方法 flip() 来呈现一个帧,当它返回时,我将 ACK 发送到控制 PC。

而已。我怎么会在阴暗的地方做到这一点?有我应该看的例子吗?

0 投票
1 回答
42 浏览

python - 在 Shady 中控制逐帧绘制

我正在努力理解如何控制 Shady 在屏幕上绘制的内容的流动。我已经习惯了 Psychtoolbox,您可以在其中通过在后台缓冲区上绘图来不断地添加帧,然后通过调用 Flip() 将其显式推送到屏幕上。使用 Shady 时,事情似乎会自动发生,因此当您将 Stimulus 对象添加到 World 时,它会尽快被绘制。但是如果我必须添加几个刺激,我怎么能保证屏幕上没有更新,直到它们都被绘制出来?

例如,假设我想绘制一个空白屏幕,并在其左上角的顶部绘制一个小方块。我可以做类似的事情:

但是我怎么能保证我不会从第 n 帧开始绘制 s1,从第 n+1 帧开始绘制 s2?也许它们可以组合成一个 Stimulus 对象,但我想将它们分开(在我的实际问题中,小方块实际上是用来触发光电管的,所以我需要能够将其闪烁一次帧,在任务期间的不同时间)。

0 投票
2 回答
54 浏览

python - 根据视频帧而不是时间控制 Shady 中的动态属性

我正在尝试使用 Shady 来呈现一系列图像帧。我正在控制另一台机器的流程,因此我首先指示运行 Shady 的机器呈现第一帧,然后再运行其余帧。我创建了一个 World 实例,并为其附加了一个动画回调函数。在这个回调中,我监听来自另一台机器的通信(使用 UDP)。首先,我收到一个命令来加载给定的序列(存储为 numpy 数组),然后我做了

当我收到显示第一帧的命令时,我会执行以下操作:

但是我现在该怎么做才能显示其他帧?在我看到的示例中, s.page 设置为时间的函数,但我需要显示所有帧,而不考虑时间。所以我正在考虑按照以下方式做一些事情:

但这行不通。或者,我想定义一个以 t 作为参数的函数,但忽略它并使用保存在全局变量中的计数器,但我想了解这样做的正确方法是什么。

0 投票
2 回答
42 浏览

python - 在 Linux Mint 上,Shady 中的 LoadPage 非常慢

我正在尝试使用 Shady 显示一系列帧,但我遇到了困难。我正在查看 25 帧,覆盖 1080x1080 像素区域。刺激是灰度的,我是离线做亮度线性化的,所以我只需要为每个像素保存一个 uint8 值。因此,完整序列约为 29Mb。我将刺激定义为 3-D numpy 数组 [1080x1080x25],然后使用 np.save() 将其保存到磁盘。然后我使用 np.load() 加载它。

此步骤大约需要 20 毫秒。据我了解,Shady 不处理 uint8 亮度值,而是处理 0 到 1 之间的浮点数。因此,我将其转换为浮点数组并除以 255。

第二步大约需要 260 毫秒,这已经不是很好了(理想情况下,我需要加载刺激并准备在 400 毫秒内呈现)。我现在创建一个包含 25 个 numpy 数组的列表,用作Stimulus 类中的pages参数:

这几乎是瞬时的。但在我的下一步,我遇到了严重的时间问题。

在这里,我要么创建一个 Stimulus 对象,要么更新它的pages属性,如果这不是我加载的第一个序列。无论哪种方式,这一步大约需要 10 秒,这大约是我在应用程序中可以容忍的 100 倍。

有没有办法显着加快速度?我究竟做错了什么?我在这台机器上有一个相当平庸的显卡(Radeon Pro WX 4100),如果这是我可以升级它的问题,但如果这不能解决它,我不想经历麻烦。

0 投票
1 回答
49 浏览

shady - osx 重新安装后,Shady 因 SyntaxError 失败

我重新安装了我的电脑,Shady 以前可以工作(我几乎没有掌握它是如何工作的,但它确实有效)。现在我似乎什至无法开始任何事情。

我是新手

当我尝试运行演示时,这就是我得到的。我认为它与阴暗无关,但我的设置有问题。我重新安装了蟒蛇,python 3.7.4

谢谢您的帮助!

0 投票
1 回答
49 浏览

python - 是否可以在 Shady 中共享动画回调?

我正在尝试使用 Shady 来呈现一系列图像帧。在过去,我通过为stimulus.page 属性分配一个动画回调来做到这一点。在 Shady 为每个监视器帧调用一次的回调中,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是肯定的,我将刺激的可见性设置为 True 并返回帧号;否则我将其设置为 False 并返回 0。就像一个魅力。

现在我需要扩展它,因为我需要从多个序列中选择一个来显示。由于加载序列可能需要一些时间,因此我在程序开始时将它们全部加载,并将每个序列与一个 Stimulus 对象相关联。现在,这是我的问题。我是否必须为每个序列(其数量可变,并且可能很高)创建不同的动画回调函数。或者有没有更优雅的方法来调用单个动画回调(或类似的东西),并在那里我确定要显示哪个序列的哪个帧(再次,基于全局变量的当前值)?

0 投票
1 回答
47 浏览

python - Shady 中的文本对齐控制

我正在使用 Shady 在屏幕上写一些文本,我想知道控制字符串对齐的最简单方法是什么。据我了解,Shady 文本对象中的 align 参数控制段落对齐,但我对控制单行文本的对齐感兴趣。
本质上,我想复制matplotlib 文本函数的水平对齐、垂直对齐和旋转参数的行为。但要做到这一点,我需要估计一旦渲染字符串将占用的区域(以像素为单位)。我能以某种方式从Shady那里得到它吗?在手册中它说渲染是在 CPU 上完成的,然后渲染的字符串被推送到 GPU,所以它应该是可行的。

0 投票
1 回答
32 浏览

python - 有没有办法暂时暂停 Shady 中的所有世界/刺激动态?

我有一个用于运行交互式程序的 Shady 脚本,该程序涉及Stimulus具有多个动态属性的众多对象。它World本身也有一些动态特性。

我需要一种方法来暂时停止交互式程序。我可以在附加到世界/刺激的自定义回调中自己处理这种“暂停”状态Animate,这些回调的数量很少,但在每个动态属性函数中处理它显然并不理想。有没有办法同时“暂停”然后“取消暂停”所有动态?最好,至少World.Animate回调(和所有事件处理程序)仍会在此暂停状态下的每一帧被调用,这样我就可以监视取消暂停的条件,并可能在暂停时做一些不同的事情。

0 投票
1 回答
56 浏览

python - Shady 中的自定义传递函数(或 LUT)

如何实现自定义颜色传递函数?
我想仔细控制我的视觉刺激的颜色。我已经看到我可以设置逐个通道的伽马,但是如果我的传递函数不能很好地拟合典型的伽马曲线怎么办?
我试过使用查找表,但似乎 Shady 唯一的 LUT 实现只使用红色通道并一次查找所有通道,而我想要一些可以独立查找每个通道的东西,以便启用使用独立的线性 R、G 和 B 通道?

0 投票
1 回答
49 浏览

python - 如何在黑幕引擎上设置自定义 FPS 限制

我目前在 144 HZ 显示器上使用 shady,我正试图将 shady world 刷新率限制为 90 Hz。据我了解,降低 FPS 的唯一方法是使用“SetSwapInterval”,它将帧速率降低一半或三分之一。有没有其他方法可以通过调用 shady 而不使用 time.sleep() 或其他基于 python 的时间来实现这种效果?