Matlab 用于更新图形元素的parfor
我试图加快图形窗口的更新过程。我用它来产生刺激,让物体在屏幕上移动。我试图分离所有进程,以加快窗口速度。修改对象坐标,并在矩阵上执行所有计算,因此代码不必从每个对象提取,只需更新位置代码即可 在基本for循环中,代码运行得非常好。然而,当我尝试合并parfor循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上和适当的空间中,但没有任何移动 有人知道为什么会这样吗?我附上了有问题的部分代码。我正在构建一个对象来保存所有变量,这就是为什么我有变量gh存在的原因Matlab 用于更新图形元素的parfor,matlab,parallel-processing,matlab-figure,parfor,Matlab,Parallel Processing,Matlab Figure,Parfor,我试图加快图形窗口的更新过程。我用它来产生刺激,让物体在屏幕上移动。我试图分离所有进程,以加快窗口速度。修改对象坐标,并在矩阵上执行所有计算,因此代码不必从每个对象提取,只需更新位置代码即可 在基本for循环中,代码运行得非常好。然而,当我尝试合并parfor循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上和适当的空间中,但没有任何移动 有人知道为什么会这样吗?我附上了有问题的部分代码。我正在构建一个对象来保存所有变量,这就是为什么我有变量gh存在的原因 function RunStim
function RunStim(gh)
figure(gh.StimWindow); % select Stimulus window to display moving objects
TrialLength = 20; % Length of trial to be run
Framerate = 60; % Freshrate of window
ObjSpeed = 20; % speed objects will travel across field
ObjList = gh.ObjectList; % Container holding movable objects present in the figure
ObjLocX = gh.ObjectLocX; % cell matrix containing object X locations (objects have varying sizes of points)
ObjLocY = gh.ObjectLocY; % cell matrix containing object Y locations (objects have varying sizes of points)
ObjRotation = gh.ObjectRotation; % array containing list of objects rotations
NumofObj = length(ObjList); % Number of Objects in stim system
timer = tic(); % Timer for the stimulus
moveforward = .03*.1*ObjSpeed; % Reduce stepping by X amount to account for angular movement along a circle
while toc(timer) < TrialLength % Run stimulus through length of project
NextStepX = cellfun(@(x) x+moveforward,ObjLocX,'un',0);
NextStepY = cellfun(@(x) x+moveforward,ObjLocY,'un',0);
NextRot = ObjRotation + moveforward;
parfor aa = 1:NumofObj
ObjList{aa}.XData = NextStepX{aa};
end
ObjLocX = NextStepX; % Update X location matrix for next step
ObjLocY = NextStepY; % Update Y location matrix for next step
ObjRotation = NextRot; % Update Rotation matrix for next step
pause(1/Framerate) % Pause window briefly to allow for drawing
end
函数RunStim(gh)
图(gh.StimWindow);%选择“刺激窗口”以显示移动的对象
三轴长度=20;%试运行时间
帧率=60;%窗的新鲜度
ObjSpeed=20;%速度物体将穿过场地
ObjList=gh.ObjectList;%容纳图中所示可移动物体的容器
ObjLocX=gh.ObjectLocX;%包含对象X位置的单元矩阵(对象具有不同大小的点)
ObjLocY=gh.ObjectLocY;%包含对象Y位置的单元矩阵(对象具有不同大小的点)
ObjRotation=gh.ObjectRotation;%包含对象旋转列表的数组
NumofObj=长度(对象列表);%stim系统中的对象数
计时器=tic();%刺激计时器
向前移动=.03*.1*对象速度;%减少X步进量,以考虑沿圆的角运动
而toc(计时器)
您正在更新parfor
部分中的ObjList
,其中
ObjList = gh.ObjectList;
是(我猜)一个对象句柄列表
parfor
将此数组的部分复制到所有工作进程,这些工作进程修改这些部分,然后将它们发送回。然后,主程序将这些部分重新组装成一个阵列。现在,这个新数组可能不再引用gh.ObjectList
中的原始对象句柄
请注意,这些工作进程无法访问主进程的内存,因此无法更新显示
简而言之,应该是并行计算,而不是更新图形
parfor
不适用于多线程计算,它启动新的MATLAB实例(默认情况下是本地的,但原则上是在集群中的不同计算机上运行)。在parfor
循环中,您不共享内存,但也不共享任何其他内容。如果一个工人要更新一个图形窗口,你不会看到它。看
请注意,默认情况下,大多数MATLAB计算都是多线程的,您不需要为此做任何特殊的操作。我的猜测是,MATLAB很难处理多个工作人员都试图写入相同的显示。我没有并行地显示东西,但是当写入文本文件时,这是一个问题。你是对的,ObjList是一个对象句柄列表。有没有一种方法可以将句柄传递给parfor循环或从parfor循环传递句柄?我记得很久以前,GPU阵列可以在matlab中用于更新一系列子地块。不过我想这些子情节是在不同的记忆中。听起来我的思路有缺陷。我正试图加快绘制图形的速度,因为我可能一次在屏幕上有200个对象。这会大大降低对象的绘制和移动速度。我认为,如果我能同时更新位置,可能会加快绘制图的速度。事实似乎并非如此。是否有一个我缺少的函数可以解决这个问题?gpuarray是否适合我正在尝试的工作?
gpuarray
用于计算,好的。我不知道这是否是最好的解决方案,但我会将每个帧保存在视频中,然后以您想要的任何速度播放。您不会共享正在设置动画的这些形状,但您应该能够实时设置数千个点的动画。也许你会发现它很慢,因为它们是独立的对象,而不是一个有许多点的单一对象?为什么不提出一个关于如何加速动画的新问题呢?添加一个MCVE!谢谢,我将写一个关于优化动画的新问题。MCVE代表什么?