这是我使用的代码:

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()的调用都需要几秒钟才能完成:在Debug中约为6s,在Release模式中约为4s。

但是,一旦更新了曲面,旋转和平移操作就非常流畅。

表面越小,更新越快。

有没有更有效的方法来更新表面位置/颜色缓冲区?

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

最佳答案

您的代码显然没有错。常见的陷阱是线框颜色。如果保留为半透明(默认),则必要的排序将减慢渲染速度。但是您已经将其设置为Visible = false

因此,在我的机器(Win 7,T430笔记本电脑,i7和类似图形)上,更新需要不到2秒的时间(不附带调试器就发布!)。恐怕就是这样。后面有很多东西...

@Edit使用ILSurface.UpdateRGBA()预先计算颜色并将其提供为离散颜色可能会更快。您将不得不尝试使用探查器来调查瓶颈。另一个选择-因为您追求的是简单的imagesc-style绘图,所以您可以自己构建图像:ILTriangles(-strip)更苗条,并且可能提供了更多选择来提高更新速度。但是,您将必须自己进行大量的重新排序/顶点生成/颜色计算。另外,这不会为您提供ILSurface的颜色栏支持。

@Edit:可以将ILImageSCPlot类用作ILSurface的苗条替代品。文档在这里:http://ilnumerics.net/imagesc-plots.html

10-07 13:48