非常缓慢的图形当鼠标指针移动图

30视图(30天)
我有一个小部件的一个序列的图像通过调用“图像()函数多次与新图像序列。通常动画收益相当快约50 - 60帧每秒。然而,如果鼠标在图窗口和绕(不点击任何东西),那么动画开始下降的时候(约2 - 3帧每秒)图中只要鼠标移动窗口。举个简单的例子(参见代码底部复制)。
我已经检查,确保“WindowButtonMotionFcn”图回调是禁用的(和所有其他图回调)。我找不到其他图,轴,甚至图像对象可能是由鼠标运动图窗口。
如果我运行性能分析和比较的结果,没有鼠标移动图窗口,我看到了功能:
ToolbarController.ToolbarController > @ obj.handleMouseMotion (e.d.)
(及其相关函数)被成千上万次,消耗90%的运行时当鼠标移动我试着关闭图的图的菜单栏,工具栏,如:
hFigure。工具栏=“没有”;
hFigure。菜单条=“没有”;
稍微有所缓解这个问题,但不是很多(也许更好的10 - 20%)。此外,即使关闭工具栏,分析器还表明
ToolbarController.ToolbarController > @obj.handleMouseMotion
仍然是消费90%的运行时间只要鼠标移动。也有函数
AxesToolbarButton.AxesToolbarButton > AxesToolbarButton.AxesToolbarButton
这也是被成千上万次,消耗一些时间。所以我也禁用AxesToolbar:
axesTB =得到(hax,“工具栏”);
axesTB。可见=“关闭”;
axesTB。BusyAction =“取消”;
(与图工具栏,似乎没有设置完全禁用AxesToolbar)。总之,关掉axesTB似乎没有帮助。
%这段代码可以用来说明的问题慢慢更新图形。
%运行这个,然后移动鼠标在图窗口。
循环= 1:50 0
图像(rand (300300),“CDataMapping”,“缩放”);
drawnow;
结束
%清除轴与“劳委会”形象()调用之前不会改变结果。然而,这个版本的代码是看似不受这个问题的影响或很少:
hImg =图像(rand (300300),“CDataMapping”,“缩放”);
循环= 1:50 0
hImg。CData =兰德(300300);
drawnow;
结束
在后一种情况下,分析器说函数
ToolbarController.ToolbarController > @ obj.handleMouseMotion (e.d.)
仍然会调用很多次,但最终只消耗约15%的运行时(不是90 + %),和动画在50 + FPS。所以有一些关于移动鼠标和创建新对象(而不是改变现有对象的属性),似乎磨matlab图形停止。同时我清楚地指出上面解决了我的小例子,在一般情况下,这样的解决方案并不总是可能的。似乎奇怪,移动鼠标在绘图对象图不必然减缓事情看起来一样。
赞赏的想法。
9日评论
皮耶罗
皮耶罗 2023年3月9日
我有一个问题,可能有相同的根。GUI我更新一个图像在一个轴(也resaonable缓慢的帧速率- 4帧/秒),如果我用鼠标悬停在这样的更新,根据不同的时刻,不能更新导致空白形象。我没有创建一个对象,只是.CData改变其属性。所有底层的数据是安全的,所以我不能抓住任何问题来解决。我也禁用轴相互作用,使轴工具栏不可见,但它并没有帮助。
请帮助。

登录置评。

答案(1)

凯利示
凯利示 2023年3月11日
我有一个类似的问题,实时绘制数据流。任何运动的老鼠uiaxes interuppted策划。在网上搜寻别人如何解决这个问题之后,我发现的组合uiaxes设置下面的代码片段所示对于我的应用程序工作良好。
%
f = uifigure ();
my_axis = uiaxes (f);
my_axis。XLimitMethod =“紧”;
my_axis。交互= [];
my_axis。PickableParts =“没有”;
my_axis。HitTest =“关闭”;
我希望这对你有用!
2的评论
凯利示
凯利示 2023年3月13日
顺便说一句,我也认为有必要来初始化一个图形对象(一个图像在你的情况中)流然后更新之前,对象属性在动画而不是创建一个新的对象在每个迭代。它大幅加快策划,(正如你所提到的)减少鼠标移动事件回调的影响。

登录置评。

类别

找到更多的在图形性能帮助中心文件交换

s manbetx 845


释放

R2020a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!