3

这是我使用的代码:

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() 的每次调用都需要几秒钟才能完成:在调试模式下约 6 秒,在发布模式下约 4 秒。

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

表面越小,更新越快。

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

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

4

1 回答 1

0

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

所以在我的机器(win 7、T430 笔记本、i7 和类似显卡)上更新需要 <2 秒(发布时没有附加调试器!)。恐怕,这就是它所需要的。后面有很多事情...

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

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

于 2013-11-02T15:05:01.973 回答