这是我使用的代码:
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