我正在处理结构化网格。我用补丁显示它,我只是试图在图中添加一个类型(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%
我在这里打开了一个帖子"Text" function very slow, bottleneck of my code,以了解是否有可能提高文本功能的性能,或者是否有更快的替代方案可用。在这里,我想弄清楚为什么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
答案 0 :(得分:1)
对于您的示例,我可以通过将渲染器更改为painters
set(gcf, 'renderer', 'painters')
根据文件
画家 - MATLAB使用的原始渲染方法更快 该图仅包含简单或小图形对象。
根据您的补丁在现实生活中的情况,您可能需要坚持使用zbuffer或openGL渲染器。通过使用低级OpenGL调用来放置文本对象,您可以获得更好的性能,但这将是很多工作。