Как зафиксировать мерцание в форме WinForms?

Я постоянно тяну кадры, и мне нужна форма для не мерцания. Как я выполняю это?

public partial class Form1 : Form
{
    Image[] dude = new Image[3];
    static int renderpoint = 0;
    int lastimage = 0;

    public Form1()
    {
        dude[1] = new Bitmap(@"snipe1.bmp");
        dude[0] = new Bitmap(@"snipe0.bmp");

        InitializeComponent();
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        MainLoop();
    }

    private void MainLoop()
    {
        double FPS = 10;

        long ticks1 = 0;
        long ticks2 = 0;
        double interval = (double)Stopwatch.Frequency / FPS;

        while (true)
        {
            ticks2 = Stopwatch.GetTimestamp();
            if (ticks2 >= ticks1 + interval)
            {
                ticks1 = Stopwatch.GetTimestamp();

                MoveGraphics();
                this.Refresh(); 
            }

            Thread.Sleep(1); 
        }
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Rectangle rect = new Rectangle(renderpoint, 0, 100, 100);
        Color lowcolor = Color.FromArgb(0, 128, 64);
        Color highcolor = Color.FromArgb(0, 128, 64);

        ImageAttributes imageAttr = new ImageAttributes();
        imageAttr.SetColorKey(lowcolor, highcolor);

        if (lastimage == 1)
        {
            lastimage = 0;
            g.DrawImage(dude[1], rect, 0, 0, 100, 100, GraphicsUnit.Pixel, imageAttr);
        }
        else
        {
            lastimage = 1;
            g.DrawImage(dude[0], rect, 0, 0, 100, 100, GraphicsUnit.Pixel, imageAttr);
        }  
    }

    void MoveGraphics()
    {
        if (renderpoint > 950)
        {
            renderpoint = 0;
        }
        else
        {
            renderpoint += 10;
        }
    }
}

Существует текущий код. Предложения?

16
задан Uwe Keim 21 May 2013 в 08:45
поделиться

2 ответа

Вставьте это в конструктор Form1:

this.DoubleBuffered = true;
13
ответ дан 30 November 2019 в 21:36
поделиться
  1. Выполните рендеринг в обработчике событий Paint
  2. Отключите автоматическое стирание фона.
  3. Включить двойную буферизацию через стили или вручную.
  4. Если вы хотите перерисовать, вызовите Invalidate

Если вы пытаетесь добиться плавной анимации, могу ли я порекомендовать перейти на WPF, OpenGL или XNA. GDI + не предназначен для анимации (цикл сообщений Windows не является системой реального времени, поэтому дрожание всегда будет).

12
ответ дан 30 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: