C#:为什么我的动画线程运行如此之慢

时间:2013-05-12 16:35:20

标签: c# multithreading animation user-interface

我目前正在创建一个GUI应用程序框架,作为Ionite Framework的一部分。我将用于我的学校最终项目, 我的问题是:

我使用线程来维护动画,

ParameterizedThreadStart iv = new ParameterizedThreadStart(o => {
  this.Size = (Size)o;
});
new Thread(()=>{
  float stepWidth = (targetWidth-currentWidth)/transition;
  float baseWidth = currentWidth;
  int tick=transition;
  while(tick-- > 0){
    baseWidth+=stepWidth;
    Invoke(iv,new Size(baseWidth,this.Height));
    Thread.Sleep(1);
  }
}).Start();

假设this运算符是Control对象。当我在我的控制对象上使用背景时,它比预期的更长。

我的代码/方法有什么问题? 感谢

1 个答案:

答案 0 :(得分:2)

Thread.Sleep(1);

这不符合你的期望。 Sleep()方法只能睡眠等于或等于操作系统时钟滴答分辨率的整数倍的间隔。默认情况下,每秒刻录64次。或15.625毫秒。所以你的动画效果比你想象的慢16倍。

这在技术上是你可以通过pinvoking timeBeginPeriod(1)来解决的。但是你不应该这样做,16毫秒就足以使任何动画看起来都很平滑。只需将stepWidth变量放大16倍即可。假设您的UI线程可以跟上所需的绘画评级。

下一步是要认识到使用线程是无用的,它仍然只能像Invoke()一样快。这要求UI线程足够响应。因此,使用普通的同步Timer代替完全相同的结果,减去线程的开销。