Эффективно нарисовать сетку в Windows Forms - PullRequest
5 голосов
/ 02 мая 2010

Я пишу реализацию игры жизни Конвея в C #. Это код, который я использую для рисования сетки, он находится в моем событии panel_Paint. g - это графический контекст.

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. Удаление всех умножений делает это быстрее, но не очень сильно.

Есть ли лучший / более эффективный способ рисовать мою сетку?

Спасибо

Ответы [ 5 ]

13 голосов
/ 02 мая 2010

Вам не нужны вложенные циклы:

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);
}
8 голосов
/ 02 мая 2010

Проблема в том, что вы рисуете линии X для каждой координаты Y. Вы можете упростить сначала, просто отрисовав строки 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
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

0 голосов
/ 28 августа 2016

Я знаю, что уже поздно, но здесь ...

for (int x = 0; x < 20; x++)
{
    for (int y = 0; y < 20; y++)
    {
        g.drawRectangle(Pens.Black, x * 32, y * 32, 32, 32);
    }
}
0 голосов
/ 02 мая 2010

Вы должны взглянуть на XNA для этого. Вероятно, было бы более эффективно сделать это в визуализированном окне вместо WinForm.

XNA - игровая среда для C #. Более подробную информацию можно найти на http://creators.xna.com/

0 голосов
/ 02 мая 2010

Создайте растровое изображение, скажем, 100x100 пикселей с линиями сетки и отобразите его в виде плиток.
Убедитесь, что шов между плитками не вызывает разрывов в пространствах сетки.

...