c#:为什么我的动画线程运行得这么慢

本文关键字:运行 线程 为什么 我的 动画 | 更新日期: 2023-09-27 18:13:09

我目前正在创建一个GUI应用程序框架,作为Ionite框架的一部分。我要用它来做期末作业,我的问题是

我使用线程来维护动画,

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对象。当我在控件对象上使用背景时,它比预期的要长。

我的代码/方法有什么问题?由于

c#:为什么我的动画线程运行得这么慢

Thread.Sleep(1);

那不会像你希望的那样。Sleep()方法只能在等于或等于操作系统时钟周期分辨率的整数倍的时间间隔内休眠。默认情况下,每秒滴答64次。也就是15.625毫秒。所以你的动画实际上比你想象的要慢16倍。

这在技术上是可以通过调用timeBeginPeriod(1)来修复的。但你不应该这样做,16毫秒已经足够让任何动画在人眼看来平滑了。简单地把你的stepWidth变量增大16倍。假设你的UI线程可以跟上所需的绘画等级。

下一步是要认识到使用线程是无用的,它仍然只能和调用()一样快。这需要UI线程有足够的响应。因此,使用一个普通的同步定时器来获得完全相同的结果,减去线程的开销。