明智的对象创建
对象开销
图形对象是复杂的结构体,它存储信息(数据和对象特征)、监听某些事件发生(回调属性),并能促使其他对象更改以适应其存在(更新坐标区范围等等)。因此,创建对象会耗费资源。
当性能成为重要考虑因素时,需要尝试采用消耗资源最少的方式来实现您的目标。
您可以按照以下原则提升性能:
不要创建不需要的对象
避免搜索对象层次结构
不要创建不需要的对象
看看您能否创建更少的对象而实现同样的效果。例如,假设您想要绘制 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)
修改数据而不是创建新对象
要查看几乎一样的图形上的不同数据,更高效的方法是更新现有对象(线条、文本等)的数据,而不是重新创建整个图形。
例如,假设您想要显示改变某些参数后对数据的影响。
设置可以预先确定的所有轴的范围,或将坐标轴范围模式设置为
manual
。使用新参数重新计算数据。
使用新数据更新线条、文本等图形中所用对象的属性。
调用
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