在Matlab GUI中更新特定对象

时间:2016-05-21 20:33:00

标签: matlab user-interface matlab-figure

我目前正在开发一个用于MATLAB的GUI,它使用(相对)高频率进行更新。它包含3个轴和一堆复选框等。在每次迭代中,我都使用drawnow命令来更新所有内容 - 这样做很好用,花花公子。

更多背景:GUI完全通过脚本控制。我使用处理程序来获取我需要的信息。

问题:我遇到了性能问题。我现在正在寻找一种方法来更新复选框状态,但保持其他一切不变。目前,我无法在不使用drawnow的情况下回读已更改的复选框状态 - 而且我无法找到有关更新特定对象的任何信息。

2 个答案:

答案 0 :(得分:2)

不幸的是,没有办法在不渲染图形的情况下刷新事件/回调队列,只是相反。也无法刷新特定图形对象的事件/回调队列,这是Value要更新的uicontrol属性所必需的。

你能做什么,而不是使用香草drawnow,考虑使用limitrate drawnow输入来确保如果你以非常高的频率更新你的情节,它们实际上最多只能以每秒20帧的速度渲染。这将防止由于所有渲染事件而导致显着延迟。

drawnow limitrate

来自文档:

  

drawnow limitrate将更新次数限制为每秒20帧。如果自上次更新后的时间少于50毫秒,或者图形渲染器忙于上一次更改,则drawow会丢弃新的更新。如果要在循环中更新图形对象而不需要在屏幕上查看每个更新,请使用此命令。跳过更新可以创建更快的动画。处理待处理的回调,因此您可以在动画期间与数字进行交互。

作为一个例子:

hcheck = uicontrol('style', 'check', 'String', 'Green');
hplot = plot(rand(10,1));
set(gca, 'ylim', [0 1], 'xlim', [1 10])

originalColor = get(hplot, 'Color');

while true
    set(hplot, 'YData', rand(10,1))

    if get(hcheck, 'value')
        set(hplot, 'Color', 'g')
    else
        set(hplot, 'Color', originalColor)
    end

    drawnow limitrate
end

enter image description here

在我的Mac上运行该示例,而不使用limitrate选项,我能够以每秒42次循环遍历while循环。启用limitrate选项后,我能够每秒循环767次。

答案 1 :(得分:1)

您可能最好使用纯摆动组件,例如private TEntity GetEntity(string className, Guid id) { var entity = Session.QueryOver<className>().FirstOrDefualt(e => e.Id == id); return entity; } 。他们没有像uicontrol那样的问题。尝试运行以下示例,您将看到可以在更改后立即查询新的复选框状态,而无需使用JCheckBox

drawnow

因此,您不一定需要刷新偶数队列来查询更新的图形状态。