动画UI时哪个更快:控件还是图片?

时间:2012-10-17 22:59:44

标签: c# winforms animation bitmap controls

/我正在使用以下内容构建的计算机上进行测试: {1 GB RAM(现为1.5 GB),1.7 GHz Intel Pentium处理器,ATI Mobility Radeon X600 GFX}

我需要缩放/变换控件并使其流畅。目前我每隔24-33ms(30fps),±3px操纵一个控件的大小和位置。当我为图像添加“淡入淡出”效果时,它会平滑地淡入淡出,但它的大小仅为25x25像素。对照尺寸为450x75像素至450x250像素。在像宝石迷阵3这样的2D游戏中,精灵没有动画,没有动画。

因为标题会建议:处理器上哪个更容易/更快:动画一个位图(在动画期间将其渲染到父控件)或动画控件是自己的?

修改 嘿,我认为这是一个很有帮助的社区,而不是一个低调率似乎没有挑战性的问题! (而且我在这里也看到了更多荒谬的问题,收视率也更高!)请先给我写一行,然后再对我的问题进行负面评价!

1 个答案:

答案 0 :(得分:1)

我设法在我的计划中找到一些空闲时间,以便快速启动一个新项目。我相信我的时间本来可以更好地花在其他地方,但希望我的鞋子里的其他人可能会在那里找到它的用途......

答案是:控件上的图片。将位图渲染到画布上时,如果有的话,会触发很少的事件。至于控件,它充满了事件 - 一些链接,一些循环,以及递归的添加,所以一个简单的'LocationChanged'事件甚至不会覆盖实际发生在幕后的一半。

对于在运行时应用了大量动态动画的控件,我要做的是开发一个两件套:一个控件[渲染]模板或活动界面(当控件处于静止状态时或在播放动画之前),以及具有基本定义属性的动画结构,例如显示图像[渲染控件],矩形边界以及可能后者应用的任何动画算法。

编辑:按要求,这里是前后代码示例:

// This is the triggering event of the translating animation
private void object_Click(object sender, EventArgs e)
{
      // the starting point is at (75,75)
      element.Transform(new Point(500, 250));
}

在:

public class ControlElement : UserControl
{
      private Timer tick;
      private Point pT0;
      public ControlElement() : base()
      {
            tick = new Timer();
            tick.Interval = 30; // about 30fps
            tick.Tick += new EventHandler(tick_Tick);
      }
      void tick_Tick(object sender, EventArgs e)
      {
            // get the new point from distance and current location/destination
            this.Location = Utils.Transform(this.Location, pT0, 3);
            if ((pT0.X - this.Location.X)+(pT0.Y - this.Location.Y) <= 0)
            {
                this.Location = pT0;
                tick.Stop();
                //this.Visible = true;
            }
      }
      public void Transform(Point destination)
      {
            pT0 = destination;
            //this.Visible = false;
            tick.Start();
      }
}

之后:我创建了一个类,其中包含使用DrawToBitmap功能控件外观的图片。它仍然包含与上面相同的动画方法。我必须添加LocationLocationChanged元素,因为此类不再是控件。如果需要访问实际控件,我将停止渲染并显示它自己的控件实例 这是渲染调用:

void element_LocationChanged(object sender, EventArgs e)
{
      canvas.Invalidate();
}
void canvas_Paint(object sender, PaintEventArgs e)
{
      if (element != null)
      {
            Bitmap bmp = new Bitmap(element.Display);
            Pen p = new Pen(Color.FromArgb(128, 128, 128), 1);
            e.Graphics.DrawImage(bmp, element.Location);
            e.Graphics.DrawRectangle(p, 
                 element.Location.X, element.Location.Y, 
                 bmp.Width, bmp.Height);
      }
}