正如保羅指出,有一個更有效的嘗試做到這一點:
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
來啓動渲染循環。
結果是一個動態線條圖,在每個渲染幀處進行更新。