Main Content

明智的对象创建

对象开销

图形对象是复杂的结构体,它存储信息(数据和对象特征)、监听某些事件发生(回调属性),并能促使其他对象更改以适应其存在(更新坐标区范围等等)。因此,创建对象会耗费资源。

当性能成为重要考虑因素时,需要尝试采用消耗资源最少的方式来实现您的目标。

您可以按照以下原则提升性能:

  • 不要创建不需要的对象

  • 避免搜索对象层次结构

不要创建不需要的对象

看看您能否创建更少的对象而实现同样的效果。例如,假设您想要绘制 10×1000 点数组,只显示标记。

此代码创建 1000 个线条对象:

x = rand(10,1000);
y = rand(10,1000);
plot(x,y,'LineStyle','none','Marker','.','Color','b');

将数据从 10×1000 转换为 10000×1。此代码创建的图形看上去一样,但只创建了一个对象:

plot(x(:),y(:),'LineStyle','none','Marker','.','Color','b')

使用 NaN 模拟多个线条

如果坐标数据包含 NaN,那么 MATLAB® 不会渲染这些点。您可以将 NaN 添加到顶点数据以创建与单独线条看上去一样的线段。将 NaN 放在每个数据向量中同样的元素位置。例如,此代码会创建三个单独线条:

x = [0:10,NaN,20:30,NaN,40:50];
y = [0:10,NaN,0:10,NaN,0:10];
line(x,y)

修改数据而不是创建新对象

要查看几乎一样的图形上的不同数据,更高效的方法是更新现有对象(线条、文本等)的数据,而不是重新创建整个图形。

例如,假设您想要显示改变某些参数后对数据的影响。

  1. 设置可以预先确定的所有轴的范围,或将坐标轴范围模式设置为 manual

  2. 使用新参数重新计算数据。

  3. 使用新数据更新线条、文本等图形中所用对象的属性。

  4. 调用 drawnow 更新图窗(以及图窗中的所有子对象)。

例如,假设您想要当数据变化时更新图形:

figure
z = peaks;
h = surf(z);
drawnow 
zlim([min(z(:)), max(z(:))]);
for k = 1:50
   h.ZData = (0.01+sin(2*pi*k/20)*z);
   drawnow
end