4

有没有办法连续绘制变化的数组数据?我有一个 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 没有更新。我在想可能是因为这个无限循环无法访问主循环,所以我也把它放在自己的线程中,但它仍然没有像我希望的那样渲染......

4

2 回答 2

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 人工作用域以便在每次更新后进行清理。一旦涉及到更大的阵列,这尤其有利可图。我添加了一个调用ilPanel1.Scene.First<ILPlotCube>().Reset(),以便将绘图立方体的限制重新调整为新的数据内容。

最后,通过启动ClockILPanel 来启动渲染循环。

结果是一个动态线图,在每个渲染帧更新自己。

在此处输入图像描述

于 2014-01-20T12:31:45.130 回答
2

我认为您需要在对形状或其缓冲区进行任何修改后调用 Configure()。使用 BeginRenderFrame 事件进行修改,您不应添加无限多的形状/新场景。最好重复使用它们!

让我知道,如果你需要一个例子...

于 2014-01-18T13:36:05.393 回答