我正在尝试加快图形窗口的更新过程。我正在使用它来产生刺激,使物体在屏幕周围移动。我试图分离所有进程,以加快窗口速度。修改了对象坐标,并在矩阵上执行了所有计算,因此代码不必从每个对象中提取,只需更新位置代码即可。
当放在基本的for循环中时,该代码可以很好地工作。但是,当我尝试合并parfor循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上,并且在适当的位置,但是什么也没动。
有人知道为什么会这样吗?我附加了有问题的部分代码。我正在构建一个对象以容纳所有变量,这就是为什么变量gh存在的原因。
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
答案 0 :(得分:0)
您正在ObjList
部分的parfor
中更新
ObjList = gh.ObjectList;
(我想)是对象句柄的列表。
parfor
将此数组的各个部分复制到所有工作进程,这些工作进程将对其进行修改,然后将其发送回。然后,主要过程会将这些部分重新组装成一个数组。到现在,这个新数组可能不再引用gh.ObjectList
中的原始对象句柄。
请注意,这些辅助进程无法访问主进程的内存,因此将无法更新显示。
简而言之,应该将计算并行化,而不是更新图形。
parfor
不适用于多线程计算,它会启动MATLAB的新实例(默认情况下是本地实例,但原则上应在集群中的不同计算机上运行)。在parfor
循环中,您不共享内存,但也不共享其他任何内容。如果工作人员要更新图形窗口,您将看不到它。参见Decide When to Use parfor
。
请注意,默认情况下,大多数MATLAB计算都是多线程的,您不需要为此做任何特殊的事情。