2010-05-02 49 views
4

我正在使用C#編寫康威生命遊戲的實現。這是我用來繪製網格的代碼,它在我的panel_Paint事件中。 g是圖形上下文。高效地在Windows窗體中繪製網格

for (int y = 0; y < numOfCells * cellSize; y += cellSize) 
{ 
    for (int x = 0; x < numOfCells * cellSize; x += cellSize) 
    { 
      g.DrawLine(p, x, 0, x, y + numOfCells * cellSize); 
      g.DrawLine(p, 0, x, y + size * drawnGrid, x); 
    } 
} 

當我運行我的程序,它是反應遲鈍,直到它完成繪製網格,在numOfCells = 100 & CELLSIZE = 10,刪除所有的乘法需要幾秒鐘使其速度更快,但不是非常多。

是否有更好/更有效的方式來繪製我的網格?

感謝

+0

如果通過這只是單步在IDE中,你就可以回答你自己的問題。 – 2010-05-02 18:17:40

+1

那有多搞笑。我認真地編寫了「生命遊戲」的細胞添加物,並尋找了一種繪製網格的方法。我看到的第一件事就是有人要求這個網格畫出'生命的遊戲':D。 – C4u 2017-03-13 07:12:11

回答

8

問題是您正在爲每個Y座標繪製X線。您可以先簡化第一個循環中的Y行,然後再循環另一個X行。

下面是一個簡單的例子

for (int y = 0; y < numOfCells; ++y) 
    { 
    g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); 
    } 

    for (int x = 0; x < numOfCells; ++x) 
    { 
    g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); 
    } 

當你的進步,你可以使用雙緩衝,以降低Control.SetStyle < BR /> http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

+0

或在相同的循環中,如果網格是一個正方形;) – 2010-05-02 13:25:41

+0

@Thomas,同意。在回答時,我對此感到困惑,我的觀點是,OP沒有看到基本問題,這就是爲什麼我首先明白問題的原因,然後一旦明白問題就從那裏得到改善。但只是一個意見。 – 2010-05-02 13:32:51

+0

呃,我不知道我在用嵌套循環的想法。謝謝您的幫助。 啓用雙緩衝似乎沒有做任何事情,但沒關係,啓動時只有一點點閃爍。 – Joel 2010-05-02 13:51:00

1

與網格線創建的,比方說,100×100像素的位圖圖像,並在瓷磚顯示。
確保瓷磚之間的接縫不會導致電網空間不連續。

12

你不要任何閃光等等看看不需要嵌套循環:

for (int i = 0; i < numOfCells; i++) 
{ 
    // Vertical 
    g.DrawLine(p, i * cellSize, 0, i * cellSize, numOfCells * cellSize); 
    // Horizontal 
    g.DrawLine(p, 0, i * cellSize, numOfCells * cellSize, i * cellSize); 
} 
0

你應該看看XNA。在渲染的窗口而不是WinForm中執行此操作可能會更有效率。

XNA是C#的遊戲框架。 尋找在http://creators.xna.com/

0

我知道這是遲,但這裏更多信息...

for (int x = 0; x < 20; x++) 
{ 
    for (int y = 0; y < 20; y++) 
    { 
     g.drawRectangle(Pens.Black, x * 32, y * 32, 32, 32); 
    } 
}