在c#Windows窗体中平滑动画

在c#Windows窗体中平滑动画,c#,winforms,animation,C#,Winforms,Animation,我想在pictureBox中逐帧(逐帧)显示动画。我有42帧,我想让它非常快。我使用了计时器组件,但interval=1毫秒太慢了,我想知道是否有任何方法可以在c#Windows窗体(Visual Studio)中使用大量帧制作快速动画。这就是我现在正在使用的 Bitmap[] FelixBanner = new Bitmap[50]; public Form1() { InitializeComponent(); for(int i

我想在pictureBox中逐帧(逐帧)显示动画。我有42帧,我想让它非常快。我使用了计时器组件,但interval=1毫秒太慢了,我想知道是否有任何方法可以在c#Windows窗体(Visual Studio)中使用大量帧制作快速动画。这就是我现在正在使用的

    Bitmap[] FelixBanner = new Bitmap[50];

    public Form1()
    {
        InitializeComponent();

        for(int i = 1; i <= 42; i++)
            FelixBanner[i] = new Bitmap(@"Photos\Felix\" + i + "FB.bmp");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        timer1.Enabled = true;
    }

    int k = 1;

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (k == 41) 
            timer1.Enabled = false;

        Felix.Image = FelixBanner[k];
        k++;
    }
Bitmap[]FelixBanner=新位图[50];
公共表格1()
{
初始化组件();

对于(int i=1;i首先,没有一个内置计时器具有1毫秒的精度。我不重复或复制我的粘贴,但请参阅高精度计时器的链接。或参阅的完整源代码

其次,使用
PictureBox
控件进行自定义渲染是一种过分的做法。除非您使用缩放/拉伸功能,或为其指定动画GIF,否则您根本不需要它。在一个简单的
面板
中渲染动画,例如使用
绘制
事件,会更加有效。这就是您可以做到的方法它:

private void timer1_Tick(object sender, EventArgs e)
{        
    if (k == 41) 
        timer1.Enabled = false;

    //Felix.Image = FelixBanner[k];
    k++;
    panelAnimation.Invalidate();
}

void panelAnimation_Paint(object sender, PaintEventArgs e)
{
    // make sure "k" is a valid index even after playing the animation because the
    // Paint event might be called whenever your form is resized or has to be repaint
    var image = FelixBanner[k];
    e.Graphics.DrawImage(image, 0, 0, image.Width, image.Height);
}

间隔为1毫秒。这应该非常快,请尝试从不同线程更改图片WinForms中的计时器组件由Windows消息泵驱动。您可以预期计时器间隔远大于1ms。可能WinForms计时器不适合计时动画,因为它不够可靠。此外,to所有的计时器都不准确,你知道人类视觉系统不能每35-45毫秒识别超过1张图片吗?你知道,这些东西可以制作电影,而不是图像。好的:)。我只是不知道如何制作平滑的动画。我是新手。好的。我添加了Panel panelAnimation=new Panel();和您编写的代码,但它没有显示任何内容。我按下按钮,什么也没发生。我以前从未使用过面板,因此如果这是非常基本的,我很抱歉。PictureBox默认启用了双缓冲,但面板没有(这里,双缓冲处于活动状态是一个优势)。过度杀戮背后的原因尚未定义。对于其余部分,它将起作用。请记住,分辨率不能小于~
35ms
(否则事件可能重叠),但是,官方不支持低于
55ms
的值。它可以提供每秒24/25帧的流,但是,该值可以使构建良好的动画对人眼平滑。@RobertGaube:您需要将面板添加到表单中。只需将其从设计器的工具箱中放到表单上(默认情况下,它将被命名为
panel1
)@Jimi:你说得对,我没有详细说明“过度杀戮”。我的意思是
PictureBox
基本上不用于重复替换其图像。设置
image
属性会导致父控件中调用
PerformLayout
,检查新值是否可以设置动画,等等。如果不使用
PictureBox
,则可以使用
PictureBox
nt始终手动重新绘制无效区域,自动播放GIF动画,并允许使用
SizeMode
属性进行一些简单的缩放。是的,设置PictureBox。如果SizeMode(自动调整大小、缩放、拉伸)发生布局事件,则图像可能会导致布局事件指示控件将图像大小调整为其ClientSize。但是,如果图像大小不变,则只会生成几次布局事件。另一方面,当设置Image属性并渲染图像时,会初始化许多其他过程。控件还需要验证是否应创建新图像使用图形对象直接在其表面上绘制图像不需要内部初始化过程。