2013-11-02 3 views
3

Вот код, я использую:Как эффективно построить большую поверхность (например, 1000x1000) в ILNumerics?

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с в Debug и ~ 4s в режиме выпуска.

После того, как поверхность обновлена, операции поворота и поворота очень текучие.

Чем меньше поверхность, тем быстрее обновление.

Есть ли более эффективный способ обновления буферов поверхности/цветов?

Примечание: с использованием IlNumerics 3.2.2 Community Edition на ноутбуке Windows 7 с двойной графикой (Intel HD 4000 + GeForce GT 650M) с активированной картой nvidia.

ответ

0

Нет ничего явно неправильного в вашем коде. Общей ошибкой является цвет каркаса. Если оставить полупрозрачным (по умолчанию), необходимая сортировка замедлит рендеринг. Но вы уже установили его в Visible = false.

Так что на моей машине (выигрыш 7, тетрадь T430, i7 и аналогичная графика) требуется < 2 секунды для обновления (Release без отладчика прилагается!). Боюсь, это все, что нужно. В задней части много чего происходит ...

@Edit Возможно, было бы быстрее прекомпомировать цвета и предоставить их в виде дискретного цвета с использованием ILSurface.UpdateRGBA(). Вам придется попытаться использовать профилировщик, чтобы исследовать узкое место. Другой вариант - с тех пор, как вы после простого рисунка в стиле изображения, - это построить собственный imagec: ILTriangles (-strip) ist более тонкий и, вероятно, дает больше возможностей для увеличения скорости обновления. Тем не менее, вам придется выполнять значительное количество переупорядочивания/вычисления вершины/вычисления цвета по своему усмотрению. Кроме того, это не даст вам поддержку цветовой панели ILSurface.

@Edit: Вы можете использовать класс ILImageSCPlot в качестве тонкой замены для ILSurface. Документация находится здесь: http://ilnumerics.net/imagesc-plots.html

+0

Если я правильно догадываюсь, трудоемкая операция - это выяснить, какие элементы сцены должны быть визуализированы. Зная, что моя конечная цель на самом деле состоит в двух графиках: поверхность с TwoDMode = true и только использование цветовой карты для представления высот, не было бы способа построить ее более эффективно? Если бы я построил плоскую поверхность и отобразил цвет в соответствии с высотами, будет ли это работать быстрее? (В настоящее время я не могу проверить это, но попробую как можно скорее.) – ice

+0

Пожалуйста, сообщите о своем завершении! Я также отредактировал ответ. –

+0

С версии 4.1 [ImageSCPlots] (http://ilnumerics.net/imagesc-plots.html) есть те, которые намного более тонкие и должны решить вашу проблему. –

Смежные вопросы