有没有办法连续绘制更改数组数据?我有一个ILLinePlot来绘制线条以改变按钮事件的数据,但我想让它连续。
while (true)
{
float[] RefArray = A.GetArrayForWrite();
//RefArray[0] = 100;
Shuffle<float>(ref RefArray);
Console.Write(A.ToString());
scene = new ILScene();
pc = scene.Add(new ILPlotCube());
linePlot = pc.Add(new ILLinePlot(A.T, lineColor: Color.Green));
ilPanel1.Scene = scene;
ilPanel1.Invalidate();
}
我遇到的问题是循环运行,我可以看到数组的更新,但ILPanel不会更新。我想也许是因为这个无限循环无法访问主循环,所以我把它放在自己的线程中,但它仍然没有像我希望的那样渲染......
答案 0 :(得分:4)
正如保罗指出的那样,有一种更有效的尝试:
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 arteficial范围,以便在每次更新后进行清理。一旦涉及更大的阵列,这尤其有利可图。我添加了对ilPanel1.Scene.First<ILPlotCube>().Reset()
的调用,以便将绘图多维数据集的限制重新调整为新数据内容。
最后,通过启动ILPanel的Clock
启动渲染循环。
结果是动态线图,在每个渲染帧更新自身。
答案 1 :(得分:2)
我认为你需要在修改形状或其缓冲区后调用Configure()。使用BeginRenderFrame事件进行修改,不应添加无限多个形状/新场景。重用它们会更好!
请告诉我,如果您需要一个例子......