正如保罗所指出的,有一种更有效的尝试来做到这一点:
private void ilPanel1_Load(object sender, EventArgs e) {
using (ILScope.Enter()) {
// create some test data
ILArray<float> A = ILMath.tosingle(ILMath.rand(1, 50));
// add a plot cube and a line plot (with markers)
ilPanel1.Scene.Add(new ILPlotCube(){
new ILLinePlot(A, markerStyle: MarkerStyle.Rectangle)
});
// register update event
ilPanel1.BeginRenderFrame += (o, args) =>
{
// use a scope for automatic memory cleanup
using (ILScope.Enter()) {
// fetch the existint line plot object
var linePlot = ilPanel1.Scene.First<ILLinePlot>();
// fetch the current positions
var posBuffer = linePlot.Line.Positions;
ILArray<float> data = posBuffer.Storage;
// add a random offset
data = data + ILMath.tosingle(ILMath.randn(1, posBuffer.DataCount) * 0.005f);
// update the positions of the line plot
linePlot.Line.Positions.Update(data);
// fit the line plot inside the plot cube limits
ilPanel1.Scene.First<ILPlotCube>().Reset();
// inform the scene to take the update
linePlot.Configure();
}
};
// start the infinite rendering loop
ilPanel1.Clock.Running = true;
}
}
在这里,完整的更新在一个匿名函数中运行,注册到BeginRenderFrame
.
场景对象被重用,而不是在每个渲染帧中重新创建。在更新结束时,场景需要知道,您是通过调用Configure
受影响的节点或其父节点中的某个节点来完成的。这可以防止场景渲染部分更新。
使用 ILNumerics 人工作用域以便在每次更新后进行清理。一旦涉及到更大的阵列,这尤其有利可图。我添加了一个调用ilPanel1.Scene.First<ILPlotCube>().Reset()
,以便将绘图立方体的限制重新调整为新的数据内容。
最后,通过启动Clock
ILPanel 来启动渲染循环。
结果是一个动态线图,在每个渲染帧更新自己。