2015-03-25 76 views
0

所以我一直在搞3D - 2D矢量轉換,並想開始編寫一些有趣的,簡單的程序來與簡單的二次曲面等進行交互。我的問題是這樣的:更快的圖形

有什麼方法可以讓我的代碼更高效?是否有其他基於C#的程序可用於圖形?

我在C#中工作(並且絕對想保持這種方式),並且我意識到我一直以非常低效的方式執行此操作。

我不知道我是否可以改善我的循環,或者我每次移動相機時計算轉換的事實,或者什麼,但任何幫助都會很棒!

下面是一些示例代碼(繪製圖像描繪的表面:http://i.imgur.com/ewjTuii.png

void ColorSurface(Point3[] S) 
    { 
     List<Panel> f = new List<Panel>(); 
     try 
     { 
      for (int x = 0; x < 9; x++) 
      { 
       for (int y = 0; y < 9; y++) 
       { 
        f.Add(new Panel(S[(10 * x) + y], S[(10 * x) + y + 1], S[(10 * x) + y + 11], S[(10 * x) + y + 10], View)); 
       } 
      } 
     } 
     catch { } 
     for (int sort = 0; sort < f.Count - 1; sort++) 
     { 
      Panel temp; 
      if (f[sort] > f[sort + 1]) 
      { 
       temp = f[sort + 1]; 
       f[sort + 1] = f[sort]; 
       f[sort] = temp; 
      } 
     } 
     using (var g = this.CreateGraphics()) 
     { 
      for (int i = 0; i < f.Count; i++) 
      { 
       double dev = f[i].PM.Z; 
       PointF[] R = new PointF[4]; 
       R[0] = Transform32(f[i].P1); 
       R[1] = Transform32(f[i].P2); 
       R[2] = Transform32(f[i].P3); 
       R[3] = Transform32(f[i].P4); 
       try 
       { 
        SolidBrush G = new SolidBrush(Color.FromArgb(235, (int)(((255/Math.PI) * (Math.Atan((dev/10) + 0.2) + (Math.PI/2)))), 0, 255 - (int)(((255/Math.PI) * (Math.Atan((dev/10) + 0.2) + (Math.PI/2)))))); 
        g.FillPolygon(G, R); 
        g.DrawPolygon(new Pen(Color.Black, 1), R); 
        DrawPoint(f[i].PM, new Pen(Color.Black, 3)); 
       } 
       catch { } 
      } 
      } 

    } 
+0

遊戲我推薦統一(單 - c#)。對於其他所有WPF ... System.Windows.Media.Media3D命名空間 – 2015-03-25 05:57:19

+0

在那裏你可以計算一次網格...並且只需移動相機 – 2015-03-25 06:02:42

+0

如果您遇到了winforms應用程序,仍然可以使用WPF控件。 .. – 2015-03-25 06:04:17

回答

2

一些快速高效提示:

  1. 一切我這裏說的應用:https://stackoverflow.com/a/11025428/1191082。特別是,您不在OnPaint中進行繪圖。請勿使用CreateGraphics。這不是壞事,你只是沒有正確地構建你的代碼,這會讓事情變得更加困難。

  2. 您正在訪問List.Count每個循環迭代。這通常會添加一個您不想要避免的非內聯方法調用(一般來說,在我之後重複「JIT不是很聰明」:))。推薦一個表格,例如for (int sort = 0, count = f.Count; sort < count - 1; sort++)等。如果您的代碼通過IList<T>從其他區域切換的引用(如作爲函數參數)訪問,則這一點尤爲重要。是的,CPU現在有很好的分支預測。但是,這仍然是一個低效率,應該在熱門路線上絕對避免。

  3. 您在每次循環迭代中分配一個全新的PointF[]。在循環之外創建一次並重用它。

  4. 更糟糕的是,您正在每次循環迭代中創建全新的SolidBrush你不打電話給Dispose就可以了!至少您需要使用using,例如using (SolidBrush G = new SolidBrush(...)) { ... }

  5. 您還在每次循環迭代中創建兩個全新的Pen s,即使它們始終相同。創建一次並重用它。也可以考慮使用Pens.Black作爲第一個,這是一個靜態緩存,您不必管理。

最後,不要做像catch { }這樣的東西。這通常在風格指南的「最差實踐」部分進行,並且「不要做這樣的事情,否則你會被燒掉」。