3

私が使用するコードは次のとおりです。

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() への各呼び出しが完了するまでに数秒かかります。デバッグ モードでは最大 6 秒、リリース モードでは最大 4 秒です。

ただし、サーフェスが更新されると、回転とパンの操作は非常にスムーズになります。

サーフェスが小さいほど、更新は速くなります。

サーフェスの位置/色のバッファを更新するより効率的な方法はありますか?

注: デュアル グラフィックス (Intel HD 4000 + GeForce GT 650M) を搭載し、nvidia カードが有効になっている Windows 7 ラップトップで IlNumerics 3.2.2 Community Edition を使用します。

4

1 に答える 1

0

コードに明らかに問題はありません。よくある落とし穴はワイヤーフレームの色です。半透明 (デフォルト) のままにしておくと、必要な並べ替えによってレンダリングが遅くなります。しかし、あなたはすでにそれを に設定していVisible = falseます。

したがって、私のマシン (win 7、T430 ノートブック、i7、および同様のグラフィックス) では、更新に 2 秒未満かかります (デバッガーを接続せずにリリースしてください!)。残念ですが、それだけで十分です。裏で色々やってますが…

@Edit 色を事前に計算し、ILSurface.UpdateRGBA() を使用して個別の色として提供する方が速い場合があります。ボトルネックを調査するには、プロファイラーを試して使用する必要があります。別のオプション - シンプルな imagesc スタイルのプロットを求めているため - 自分で imagesc を構築することです: ILTriangles(-strip) ははるかにスリムで、おそらく更新速度を上げるためのより多くのオプションを提供します。ただし、かなりの量の並べ替え/頂点生成/色計算を自分で行う必要があります。また、これは ILSurface のカラーバー サポートを提供しません。

@Edit: ILImageSCPlotクラスを ILSurface のスリムな代替品として使用できます。ドキュメントはこちら: http://ilnumerics.net/imagesc-plots.html

于 2013-11-02T15:05:01.973 に答える