使用WinForms和计时器(C#)平滑动画

使用WinForms和计时器(C#)平滑动画,c#,winforms,animation,timer,C#,Winforms,Animation,Timer,我只是在玩WinForms和C。现在,我正在尝试设置一个矩形从左边缘移动到右边缘的动画。动画正在运行。但动画并不流畅。比如帧速率有点变化 你有什么想法吗?我不想使用图形库(DirectX、OpenGL)等,我更喜欢使用WinForms(我已经在开发wpf版本),而不使用背景图形。我只是想了解一些2D/3D的概念,也许你有一些好主意=) 这是我的代码: PictureBox pbScreen; public FormMain() { ... bmp

我只是在玩WinForms和C。现在,我正在尝试设置一个矩形从左边缘移动到右边缘的动画。动画正在运行。但动画并不流畅。比如帧速率有点变化

你有什么想法吗?我不想使用图形库(DirectX、OpenGL)等,我更喜欢使用WinForms(我已经在开发wpf版本),而不使用背景图形。我只是想了解一些2D/3D的概念,也许你有一些好主意=)

这是我的代码:

PictureBox pbScreen;
public FormMain()
        {
        ...

        bmpFB = new Bitmap(640, 480);
        bmpBB = new Bitmap(640, 480);

        ...

        tmrTick.Interval = 10;
        tmrTick.Enabled = true;
    }

    private void TmrTick_Tick(object sender, EventArgs e)
    {
        RefreshScreen();
    }

    private void RefreshScreen()
    {
        CalcBackBuffer();
        bmpFB = bmpBB;
        pbScreen.Image = bmpFB;
    }

    private void CalcBackBuffer()
    {
        posX += 1;

        // Collision reaction
        // if the rectangle arrives at the edge, the position X will be resetet to 0
        if (posX > pbScreen.Width)
        {
            posX = pbScreen.Location.X;
        }

        using (Graphics gr = Graphics.FromImage(bmpBB))
        {
            gr.Clear(Color.White);
            gr.FillRectangle(Brushes.Black, new Rectangle(posX, posY, 2, 480));

        }
    }
编辑: 嗯,好的,我在一个面板中设置了动画,没有改进。今天我用WPF(Canvas.Children的矩形)对它进行了编码,但没有改进。我不知道是什么问题

我的目标是尝试一些图形概念,从零开始。所以第一件事就是把一个图形元素从一个地方翻译到另一个地方。然后尝试双缓冲以消除闪烁。然后用VSync消除撕裂等

我只需要一个绘图区域,在那里我可以画一些像素在定时器滴答


矩形的移动不是连续的。情况各不相同。你可以看到它的长袜。我尝试过类似Lerp的方法,但它是一种线性运动,所以在这种情况下没有意义。

1。在窗体中创建一个面板并直接在其上绘制。2.使用3。在计时器勾选时,使面板无效以刷新。4.在表单5上设置双缓冲。在勾号事件(或从该事件调用的函数)中执行计算在绘制事件中不执行计算,仅将其保存为绘图。。。这会让你找到一些地方,好吧,我会试着在面板上画出来,然后进行明确的计算。我试图自己编写的双缓冲。谢谢。用WinForms矛盾修饰法平滑动画。