0

我怀疑我是否以正确的方式这样做。

我必须以大约 60fps 的速度播放动画。我正在使用 aList<Image>在初始化时加载所有帧。然后使用 a每10 毫秒System.Timers.Timer调用一次事件,这将更改.pictureBox

List<Image> imageList = new List<Image>();

private static Timer_Event(o, e)
{
    pictureBox.Image = imageList[i++];
}

那么,我这样做对吗?有更好的方法吗?

4

4 回答 4

2

您所描述的似乎不太可能以稳健的方式工作。这是一个简短的摘要:

  • 根据我的经验,计时器通常并不准确。由于计时器消息通过 Windows 消息泵,它们的移动速度只能与 Windows UI 处理消息的速度一样快。任何干扰消息的应用程序都会导致您的计时器结结巴巴,尽管仔细工作可以防止大部分情况发生。这里有一些关于计时器的经典讨论:Winforms Timer for Dummies

  • 一般来说,List 是一种非常低效的图像存储方式。对于每秒 60 帧的一秒动画,您必须在内存中保存 60 张图像并单独解压缩每张图像。

以下是一些可能的解决方案,以及它们带来的权衡:

全动态视频

如果您希望在表单上呈现全动态视频,您应该真正考虑使用MediaElement(对于 WPF 应用程序:http ://www.c-sharpcorner.com/uploadfile/dpatra/media-element-in-wpf/ )或MediaPlayer对象(对于 WinForms 应用程序:http: //msdn.microsoft.com/en-us/library/bb383953 (v=vs.90).aspx )。

这将允许您播放包含极高质量图像、不同压缩的长视频,并可以任意开始或停止播放。但是,完整视频播放器的启动和内存使用要求不仅仅是在屏幕上显示单个图像。您会发现您的应用程序需要一些时间来初始化视频子系统,这可能很烦人。

动画图像

可以在 Windows 窗体或 WPF 中的图片框中显示动画图像。您只需生成动画图像 - 通常使用 GIF 动画文件。这对于大多数简单动画都可以顺利运行,并且可以从以下网站获得免费使用的动画 GIF:http: //www.chimply.com/Generator

以下是如何在表单上放置动画 GIF 的演练:http: //trompelecode.com/2010/12/animated-progress-indicator-in-csharp-windows-forms/

精灵动画

假设您需要准确地表示每个图像(如果您只是想看起来很吸引人,这不是必需的),并且您不想要视频系统的开销(如果您只是在玩,这没关系一两秒钟的动画)。然后你想要做的是创建一个单一的复合“精灵”图像。这减少了应用程序的内存开销需求并减少了解压缩文件的时间。

例如,这是一个为您生成 PNG 精灵的网站:http ://wearekiss.com/spritepad

生成带有精灵的图像后,您可以将其放置在图片框中,并通过更改图片在图片框中的相对位置来为图像设置动画。以下是如何完成此操作的演练:C#picturebox load image with a offset

概括

无论您选择以何种方式显示动画图像,都会有一些取舍。我喜欢为自己选择最简单的解决方案——就我而言,我喜欢使用动画 GIF 图像。祝动画好运!

于 2012-09-04T16:23:37.153 回答
0

您还可以使用WPF将动画放在一起或 Silverlight 将动画放在一起……如果您需要动画是交互式的或可编程控制的,这可能是可行的方法。

另一方面,如果动画内容是静态的,那么 AVI(或 MPEG 等)可能是您最好的选择。

您没有确切地说出您要完成的工作,所以我无法确定。

于 2012-09-04T16:34:37.290 回答
0

.avi 是另一种选择,但是,如果你有一堆图像而不是使用线程/计时器显然似乎是前进的方向。

于 2012-09-04T16:21:07.987 回答
0

最简单的方法是在该图片框中使用动画 gif 并且不要弄乱计时器。

于 2012-09-04T16:25:11.757 回答