Какой хороший элемент управления используется для перерисовки большого графического содержимого в Windows Forms? - PullRequest
1 голос
/ 18 марта 2012

Я создаю редактор базового уровня для игры, основанной на плитках, поэтому я ищу хороший / оптимальный способ рисования группы плиток, которые соответствуют минимальному типичному разрешению экрана (~ 1080p); таким образом, который позволяет мне быстро перерисовывать вещи при необходимости (включая наложенную сетку).

Я пытался заставить его работать, используя элемент управления PictureBox, рисуя в событии OnPaint. Сначала я подумал, что это может быть хорошей идеей, пока не осознал, насколько медленным стало перерисовывание, когда я добавил простой алгоритм рисования сетки - для завершения перерисовок при высоких разрешениях потребовалось несколько секунд (хотя <1080p все же). </p>

Я не вижу, чтобы это решение масштабировалось очень хорошо, чтобы позволить мне создать редактор без задержек. У кого-нибудь есть какие-либо предложения относительно компонента или метода, позволяющего сделать этот вид полуинтенсивного графического рисования / перерисовки возможным?

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

Код чертежа :

public void DrawLevel(Graphics graphics, Rectangle viewport)
{
    SolidBrush b = new SolidBrush(Color.DarkGray);
    graphics.FillRectangle(b, 0, 0, viewport.Width, viewport.Height);
}

public void DrawGrid(Graphics graphics, Rectangle viewport)
{
    Pen p = new Pen(Color.Black, 1);
    for (int x = 0; x < viewport.Width; x++)
    {
        for (int y = 0; y < viewport.Height; y++)
        {
            if (x == 0 || (x % 32) == 0)
                graphics.DrawLine(p, x, 0, x, viewport.Height - 1);
            if (y == 0 || (y % 32) == 0)
                graphics.DrawLine(p, 0, y, viewport.Width - 1, y);
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Этот код странный с O (viewport.Width * viewport.Height)

for (int x = 0; x < viewport.Width; x++) 
{ 
    for (int y = 0; y < viewport.Height; y++) 
    { 
        if (x == 0 || (x % 32) == 0) 
            graphics.DrawLine(p, x, 0, x, viewport.Height - 1); 
        if (y == 0 || (y % 32) == 0) 
            graphics.DrawLine(p, 0, y, viewport.Width - 1, y); 
    } 
} 

Использовать следующий код с O ((viewport.Width + viewport.Height) / 32)

for (int x = 0; x < viewport.Width; x+=32) 
{ 
   graphics.DrawLine(p, x, 0, x, viewport.Height - 1); 
}
for (int y = 0; y < viewport.Height; y+=32) 
{ 
   graphics.DrawLine(p, 0, y, viewport.Width - 1, y); 
}
2 голосов
/ 18 марта 2012

Вы можете использовать OpenTK с GLControl.

...