避免更新静态数据
如果定义图形场景的数据只有一小部分随着屏幕的每次更新而变化,那么您可以通过仅更新变化的数据来提高性能。下面的例子说明了这种技术。
性能较差的代码 | 性能更好的代码 |
---|---|
在这个例子中,一个标记通过在每次循环中创建两个对象来沿着表面移动。 [sx,sy,sz] =峰值(500);Nframes = 490;为T = 1:nframes surf(sx,sy,sz,“EdgeColor”,“没有”)举行在plot3 (sx (t + 10 t), sy (t, t + 10),…深圳(t + 10 + 10) + 0.5,“o”,…“MarkerFaceColor”,“红色”,…“MarkerSize”, 14)从drawnow结束 |
创建曲面,然后更新 [sx,sy,sz] =峰值(500);Nframes = 490;冲浪(sx, sy,深圳,“EdgeColor”,“没有”)举行在H = plot3(sx(1,1),sy(1,1),sz(1,1),“o”,…“MarkerFaceColor”,“红色”,…“MarkerSize”14);持有从为T = 1:nframes set(h,“XData”sx (t + 10, t),…“YData”sy (t, t + 10),…“ZData”深圳(t + 10, t + 10) + 0.5) drawnow结束 |
分割数据以减少更新时间
考虑这样一种情况,当代码在循环中执行时,对象的数据增长非常大,例如随着时间的推移跟踪信号的行。
每次呼叫drawnow
,更新被传递给渲染器。数据数组越大,性能越差。如果您正在使用这种模式,请采用右边示例中描述的分割方法。
性能较差的代码 | 性能更好的代码 |
---|---|
%增长数据图(“位置”,[10,10,1500,400]) n = 5000;H =楼梯(1,1);Ax = gca;斧子。XLim = [1,n];斧子。YLim = [0,1];斧子。ZLim = [0,1];斧子。NextPlot =“添加”;Xd = 1:n;Yd = rand(1,n);抽搐为Ix = 1:n set(h,“XData”xd(1:第九)“YData”码(1:第九));drawnow;结束toc |
分段数据图(“位置”,[10,10,1500,400]) n = 5000;Seg_size = 500;Xd = 1:n;Yd = rand(1,n);H =楼梯(1,1);Ax = gca;斧子。XLim = [1,n];斧子。YLim = [0,1]; ax.ZLim = [0,1]; ax.NextPlot =“添加”;Tic start = 1;为第九= 1:n限制对象大小如果(ix-start > seg_size) start = ix-1;H =楼梯(1,1);结束集(h,“XData”第九,xd(开始:),…“YData”码(开始:第九));%更新显示在50个点块如果Mod (ix,50) == 0 drawnow;结束结束toc 这段代码的性能更好,因为限制因素是更新期间发送的数据量。 |
这个话题有用吗?