2013-11-02 22 views
3

下面是我使用的代码:如何在ILNumerics中有效地绘制大表面(例如,1000x1000)?

public partial class Form1 : Form 
{ 
    private ILPlotCube plotcube_ = null; 
    private ILSurface surface_ = null; 

    public Form1() 
    { 
     InitializeComponent(); 

     ilPanel1.Driver = RendererTypes.OpenGL; 
    } 

    private void ilPanel1_Load(object sender, EventArgs e) 
    { 
     var scene = new ILScene(); 
     plotcube_ = scene.Add(new ILPlotCube(twoDMode: false)); 
     plotcube_.MouseDoubleClick += PlotCube_MouseDoubleClick; 

     ilPanel1.Scene = scene; 
    } 

    private void PlotCube_MouseDoubleClick(object sender, ILMouseEventArgs e) 
    { 
     ResetSurface(); 
     e.Cancel = true; 
     e.Refresh = true; 
    } 

    private void ResetSurface() 
    { 
     using (ILScope.Enter()) 
     { 
      ILArray<float> array = ILMath.tosingle(ILSpecialData.sincf(1000, 1000)); 

      if (surface_ == null) 
      { 
       surface_ = new ILSurface(0); 
       surface_.Fill.Markable = false; 
       surface_.Wireframe.Visible = false; 
       plotcube_.Add(surface_); 
      } 

      surface_.UpdateColormapped(array); 
      surface_.UseLighting = false; 
     } 

     plotcube_.Plots.Reset(); 
    } 
} 

每次调用ResetSurface()需要几秒钟就可以完成:在〜调试和6S〜4S在Release模式。

表面更新后,旋转和平移操作非常流畅。

表面越小,更新速度越快。

是否有更高效的方法来更新曲面位置/颜色缓冲区?

注意:在Windows 7笔记本电脑上使用IlNumerics 3.2.2 Community Edition双显卡(Intel HD 4000 + GeForce GT 650M),并激活nvidia卡。

回答

0

你的代码没有什么明显的错误。常见的陷阱是线框颜色。如果剩下的是半透明(默认),则必要的排序会降低渲染速度。但是您已将其设置为Visible = false

因此,在我的机器(赢7,T430笔记本,i7和类似的图形),需要< 2秒更新(释放没有附加调试器!)。我担心,这正是它所需要的。有很多东西在后面......

@Edit使用ILSurface.UpdateRGBA()预先计算颜色并将它们提供为离散颜色可能会更快。您将不得不尝试使用分析器来调查瓶颈。另一个选择 - 因为你是在一个简单的图像风格的情节 - 是建立自己的imagesc:ILTriangles(-strip)是更加苗条,并可能提供更多的选项来提高更新速度。但是,你必须自己做大量的重新排序/顶点生成/颜色计算。另外,这不会为您提供ILSurface的彩条支持。

@编辑:您可以使用ILImageSCPlot类作为ILSurface的瘦身替代品。文档在这里:http://ilnumerics.net/imagesc-plots.html

+0

如果我正确猜测,耗时的操作是找出场景的哪些元素将被渲染。知道我的最终目标实际上是用TwoDMode = true绘制一个曲面,并且只使用一个颜色映射来表示高度,是不是可以更有效地绘制它?如果我绘制出平坦的表面并根据高度渲染颜色,那么处理速度会更快吗? (我目前无法测试,但会尽快尝试。) – ice

+0

请回报您的结论!我编辑了答案以及.. –

+0

从版本4.1 [ImageSCPlots](http://ilnumerics.net/imagesc-plots.html)有更多的苗条,应该解决您的问题。 –

相关问题