问题标签 [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.
python - 在 Shady 中呈现预先准备好的图像数组的一部分
我有兴趣从 psychtoolbox 迁移到shady以进行刺激演示。我查看了在线文档,但我不太清楚如何复制我目前在 matlab 中所做的事情。
我所做的其实很简单。对于每次试验,
我从磁盘加载单个图像(我离线进行亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激为 1000x1000 像素,我呈现 25 帧,因此图像为 5000x5000 像素。我只使用 BW 图像,所以我每个像素有一个 int8 值)。
我将整个图像从 CPU 传输到 GPU
在某些时候(外部控制)我将第一帧复制到视频缓冲区并呈现它
在其他某个点(外部控制),我触发剩余 24 帧的显示(将图像的相关部分复制到每个视频帧的视频缓冲区,然后调用翻转())。
外部控制是通过让另一台机器通过 TCP/IP 与刺激呈现代码进行通信来实现的。在控制PC向演示PC发送命令并执行后,演示PC需要向控制PC发送回确认消息。我需要发送三个 ACK 消息,一个当屏幕上出现第一帧时,一个当屏幕上出现第二帧时,一个当屏幕上出现第 25 帧时(这样控制 PC 可以轻松验证是否丢帧)。在 matlab 中,我通过调用阻塞方法 flip() 来呈现一个帧,当它返回时,我将 ACK 发送到控制 PC。
而已。我怎么会在阴暗的地方做到这一点?有我应该看的例子吗?
python - 在 Shady 中控制逐帧绘制
我正在努力理解如何控制 Shady 在屏幕上绘制的内容的流动。我已经习惯了 Psychtoolbox,您可以在其中通过在后台缓冲区上绘图来不断地添加帧,然后通过调用 Flip() 将其显式推送到屏幕上。使用 Shady 时,事情似乎会自动发生,因此当您将 Stimulus 对象添加到 World 时,它会尽快被绘制。但是如果我必须添加几个刺激,我怎么能保证屏幕上没有更新,直到它们都被绘制出来?
例如,假设我想绘制一个空白屏幕,并在其左上角的顶部绘制一个小方块。我可以做类似的事情:
但是我怎么能保证我不会从第 n 帧开始绘制 s1,从第 n+1 帧开始绘制 s2?也许它们可以组合成一个 Stimulus 对象,但我想将它们分开(在我的实际问题中,小方块实际上是用来触发光电管的,所以我需要能够将其闪烁一次帧,在任务期间的不同时间)。
python - 根据视频帧而不是时间控制 Shady 中的动态属性
我正在尝试使用 Shady 来呈现一系列图像帧。我正在控制另一台机器的流程,因此我首先指示运行 Shady 的机器呈现第一帧,然后再运行其余帧。我创建了一个 World 实例,并为其附加了一个动画回调函数。在这个回调中,我监听来自另一台机器的通信(使用 UDP)。首先,我收到一个命令来加载给定的序列(存储为 numpy 数组),然后我做了
当我收到显示第一帧的命令时,我会执行以下操作:
但是我现在该怎么做才能显示其他帧?在我看到的示例中, s.page 设置为时间的函数,但我需要显示所有帧,而不考虑时间。所以我正在考虑按照以下方式做一些事情:
但这行不通。或者,我想定义一个以 t 作为参数的函数,但忽略它并使用保存在全局变量中的计数器,但我想了解这样做的正确方法是什么。
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),如果这是我可以升级它的问题,但如果这不能解决它,我不想经历麻烦。
shady - osx 重新安装后,Shady 因 SyntaxError 失败
我重新安装了我的电脑,Shady 以前可以工作(我几乎没有掌握它是如何工作的,但它确实有效)。现在我似乎什至无法开始任何事情。
我是新手
当我尝试运行演示时,这就是我得到的。我认为它与阴暗无关,但我的设置有问题。我重新安装了蟒蛇,python 3.7.4
谢谢您的帮助!
python - 是否可以在 Shady 中共享动画回调?
我正在尝试使用 Shady 来呈现一系列图像帧。在过去,我通过为stimulus.page 属性分配一个动画回调来做到这一点。在 Shady 为每个监视器帧调用一次的回调中,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是肯定的,我将刺激的可见性设置为 True 并返回帧号;否则我将其设置为 False 并返回 0。就像一个魅力。
现在我需要扩展它,因为我需要从多个序列中选择一个来显示。由于加载序列可能需要一些时间,因此我在程序开始时将它们全部加载,并将每个序列与一个 Stimulus 对象相关联。现在,这是我的问题。我是否必须为每个序列(其数量可变,并且可能很高)创建不同的动画回调函数。或者有没有更优雅的方法来调用单个动画回调(或类似的东西),并在那里我确定要显示哪个序列的哪个帧(再次,基于全局变量的当前值)?
python - Shady 中的文本对齐控制
我正在使用 Shady 在屏幕上写一些文本,我想知道控制字符串对齐的最简单方法是什么。据我了解,Shady 文本对象中的 align 参数控制段落对齐,但我对控制单行文本的对齐感兴趣。
本质上,我想复制matplotlib 文本函数的水平对齐、垂直对齐和旋转参数的行为。但要做到这一点,我需要估计一旦渲染字符串将占用的区域(以像素为单位)。我能以某种方式从Shady那里得到它吗?在手册中它说渲染是在 CPU 上完成的,然后渲染的字符串被推送到 GPU,所以它应该是可行的。
python - 有没有办法暂时暂停 Shady 中的所有世界/刺激动态?
我有一个用于运行交互式程序的 Shady 脚本,该程序涉及Stimulus
具有多个动态属性的众多对象。它World
本身也有一些动态特性。
我需要一种方法来暂时停止交互式程序。我可以在附加到世界/刺激的自定义回调中自己处理这种“暂停”状态Animate
,这些回调的数量很少,但在每个动态属性函数中处理它显然并不理想。有没有办法同时“暂停”然后“取消暂停”所有动态?最好,至少World.Animate
回调(和所有事件处理程序)仍会在此暂停状态下的每一帧被调用,这样我就可以监视取消暂停的条件,并可能在暂停时做一些不同的事情。
python - Shady 中的自定义传递函数(或 LUT)
如何实现自定义颜色传递函数?
我想仔细控制我的视觉刺激的颜色。我已经看到我可以设置逐个通道的伽马,但是如果我的传递函数不能很好地拟合典型的伽马曲线怎么办?
我试过使用查找表,但似乎 Shady 唯一的 LUT 实现只使用红色通道并一次查找所有通道,而我想要一些可以独立查找每个通道的东西,以便启用使用独立的线性 R、G 和 B 通道?
python - 如何在黑幕引擎上设置自定义 FPS 限制
我目前在 144 HZ 显示器上使用 shady,我正试图将 shady world 刷新率限制为 90 Hz。据我了解,降低 FPS 的唯一方法是使用“SetSwapInterval”,它将帧速率降低一半或三分之一。有没有其他方法可以通过调用 shady 而不使用 time.sleep() 或其他基于 python 的时间来实现这种效果?