0

我正在处理结构化网格。我用补丁显示它,我只是尝试在图中添加一个类型为 (m,n) 的文本,该文本指示每个节点的索引。我使用文本函数,将来我想绘制变量的节点值(随时间变化,这就是文本函数在循环内的原因)。我分析了代码,大部分时间都花在了drawow、cla和text函数上:

drawnow                              7.882 s    51.7%
text(x(:),y(:),charINPUT(:),'C...    4.348 s    28.5% 
cla                                  2.300 s    15.1%

我在这里打开了一个线程“文本”功能非常慢,这是我的代码的瓶颈,以了解它是否可以提高文本功能的性能或是否有任何更快的替代方案可用。在这里,我想弄清楚为什么 drawow 和 cla 这么慢。如果我删除 cla 它会变得更慢:

drawnow                             42.774 s 86.2%  
text(x(:),y(:),charINPUT(:),'C...    4.638 s  9.3%

与drawow 采取了很多。添加 cla 有帮助,但仍然很慢!

它只是一个 71 x 71 的网格,如果增加单元格的数量,代码基本上会卡住。有什么建议可以加快速度吗?(注意:我使用补丁是因为我想为每个单元格绘制一些网格数量,并且我想保持它的通用性,以防我移动到具有不规则多边形的非结构化网格,这些网格会随时间移动,这就是它在时间步进内的原因。

编辑:我首先认为补丁非常快,因为它只需要几毫秒,但正如grantnz 在下面的评论中指出的那样,它实际上是在调用drawow 时绘制的。如果在下面提供的代码中注释了行 hpatch3 = ... ,则这是使用探查器的时间:

    text(x(:),y(:),charINPUT(:),'C..      4.539 s   58.4%   
    cla                                   2.285 s   29.4% 
    drawnow                               0.576 s    7.4%

因此,现在事情变得有点苦涩,但仍然很慢。看起来创建和绘制补丁大约需要 7 秒,而创建和绘制文本大约需要 8 秒。主要区别在于,对于文本,时间主要花在函数本身(和 cla)上,而对于补丁,时间主要花在 drawow 上。知道为什么会这样吗?有没有可能加快一点速度?这是我的代码。

%define grid and grid numbering
ntimesteps = 10
DX = 10 ; %=DY
mmax = 71; %= number of nodes in x
nmax = mmax %= number of nodes in y
[ x y ] = meshgrid(0:DX:DX*(mmax-1),0:DX:DX*(mmax-1)); %grid
[ mMAT nMAT ] = meshgrid(1:mmax,1:nmax); %grid numbering

for j=1:ntimesteps    
   cla    
   %
   %display patch
   %
   cont = 0
   for m=2:mmax
       for n=2:nmax
           cont=cont+1;
           Xpatch(1:4,cont) = [ x(n-1,m-1) ; x(n-1,m) ; x(n,m) ; x(n,m-1) ] ;% ii+1 since it has the BC
           Ypatch(1:4,cont) = [ y(n-1,m-1) ; y(n-1,m) ; y(n,m) ; y(n,m-1) ] ;
           Zpatch(cont) = 1;
       end
   end
   hpatch3 = patch(Xpatch(:,:),Ypatch(:,:),Zpatch(:)');
   %
   % display node indices
   %
   charINPUT = regexp(sprintf('(%d,%d)\n',mMAT(:),nMAT(:)),'(?<=\s*)(\S*)(?=\n)','match'); % use regexp to vectorize sprintf and so avoid slow loops with sprintf
   text(x(:),y(:),charINPUT(:),'Clipping', 'on');
   set(gcf,'position',[9 40 1350 650])
   set(gcf,'PaperPositionMode','auto')
   %
   % other things  added to the plot
   %
    drawnow
end
4

1 回答 1

1

对于您的示例,我可以通过将渲染器更改为painters

set(gcf, 'renderer', 'painters')

根据文档

画家 - 当图窗仅包含简单或小型图形对象时,MATLAB 使用的原始渲染方法更快。

根据您的补丁在现实生活中的情况,您可能需要坚持使用 zbuffer 或 openGL 渲染器。您可以通过使用低级 OpenGL 调用来放置文本对象来获得更好的性能,但这将是很多工作。

于 2013-10-06T15:09:44.720 回答