【问题标题】:building smooth animation in C#在 C# 中构建流畅的动画
【发布时间】:2012-10-31 14:45:51
【问题描述】:

首先是代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace winform_project
{
  public partial class Form1 : Form
  {
    void movement_correct(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top += (i - 1);
        pic.Left += (i + 3);
    }

    void movement_up(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top -= (i - 1);
        pic.Left -= (i + 3);
    }
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            movement_correct(pictureBox1, i);
            movement_correct(pictureBox2, i);
            movement_correct(pictureBox3, i);
            movement_correct(pictureBox4, i);
            movement_correct(pictureBox5, i);
            movement_correct(pictureBox6, i);
            movement_correct(pictureBox7, i);
            movement_correct(pictureBox8, i);
            movement_correct(pictureBox9, i);
            movement_correct(pictureBox10, i);
        }

        for (int i = 0; i < 5; i++)
        {
            movement_up(pictureBox1, i);
            movement_up(pictureBox2, i);
            movement_up(pictureBox3, i);
            movement_up(pictureBox4, i);
            movement_up(pictureBox5, i);
            movement_up(pictureBox6, i);
            movement_up(pictureBox7, i);
            movement_up(pictureBox8, i);
            movement_up(pictureBox9, i);
            movement_up(pictureBox10, i);
        }

    }
 }
}

有 10 个虚拟图片框。每当我点击按钮时,它们就会开始移动一点(有点像太空入侵者中的敌人)。

我正在尝试在 winforms 中制作流畅的动画。问题是动画没有我想要的那么流畅。在我的代码中,所有的盒子都没有同时移动,它们的移动有一点明显的差距。我想要的是流畅的运动。

我正在考虑多线程,但后来意识到这意味着每个对象都有一个线程。有没有其他方法(在winforms内)。

感谢您的帮助。

【问题讨论】:

  • 标记这个 WinForms。怀疑多线程不会有帮助。你能去WPF吗?
  • 每个控件移动休眠 25 毫秒将导致它以 4 fps 的速度移动控件。这会明显变慢。
  • @JamesB 每帧之间的 25 毫秒可以达到 40 fps。看起来有点错别字。但是,人眼perceives roughly 10-12 fps,所以任何高于此的都可以。
  • @WinCoder Winforms 不适用于游戏(带有动画)。使用不同的技术,有几种替代方案(您可能想研究 XNA,因为您使用的是 C#)。
  • @Msonic 但有 10 个控件,使每个完整循环 250 毫秒

标签: c# .net winforms multithreading animation


【解决方案1】:

Thread.Sleep(n) 用于计时目的是保证无法获得流畅动画的方法;这是因为传递给Thread.Sleep 的值被操作系统视为最短睡眠时间,这意味着睡眠的实际持续时间可以(并且通常是)更长一点。您应该改为使用 QueryPerformanceCounter 驱动您的动画。

即使使用适当的高分辨率计时引擎,您仍然会有“撕裂”效果。

【讨论】:

  • 链接上的 cmets 建议使用秒表类。即使那样,正如您所说,动画的“流畅度”也没有明显差异。我猜这是一项技术的局限之一。
  • 不,可以在 Winforms 中制作完美流畅的动画(“撕裂”除外,这是一个不同的问题)。发布您修改过的代码(使用 QueryPerformanceCounter),我们应该可以确定问题所在。您的代码中不应仍有任何 Thread.Sleep(n) 调用。
【解决方案2】:

在 for 循环中调用 this.SuspendLayout()this.ResumeLayout() 将有助于保持所有框同时移动。它可能不会让您获得顺畅,但它会让一切都像一个整体一样移动。

【讨论】:

    【解决方案3】:

    从方法中取出sleep() 并在循环迭代中执行一次,将每个框的movement_correct()movement_up() 调用之间的延迟从(超过250 毫秒)减少到(略超过25 毫秒)。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2013-05-12
      • 2014-10-30
      • 2010-11-07
      相关资源
      最近更新 更多