良好的实践,模式同时实现异步2d winforms元素

时间:2013-02-08 20:47:58

标签: c# winforms asynchronous drawing 2d

如果有人可以在以下主题中建议我,我将不胜感激:

我准备了小型Windows窗体游戏应用程序,它在主窗体上以这种方式实现了以下事件:

Shown += (sender, e) => GameItem.Start();

假设函数Start()负责在形式上绘制球:

  while (true)
     {            
        game.BoardUI.pboxBall.Location = new Point(X++, Y++);
        game.BoardUI.pboxBall.Image = global::BoringGame.Properties.Resources.redBall;
         Application.DoEvents();
     }

主表单已实现另一个事件:

MouseMove += (sender, e) => Game.MoveBoard(e.X);

这个事件负责绘制球的结果和反弹。 此事件异步工作,但绘制的电路板闪烁。

我想知道如何实现事件mouseMove,以便鼠标项的绘制移动不闪烁:

   public void MoveBoard(int x)
     { 
        new Thread(() =>
        {
           game.BoardUI.pboxPaddle.Location = new Point(X, Y);
            game.BoardUI.pboxPaddle.Image = global::BoringGame.Properties.Resources.ballPad;
        }).Start();                
    }

我尝试使用SynchronizationContext UiSyncContext;

我该怎么做才能改进我的应用。 我需要单独的线程来提供鼠标移动事件吗?如果是,那么如何使用呢? 也许绘图没有优化 - 也许我应该使用另一个控件来绘制移动元素。 目前我使用的是picturebox。

如果有人就此问题向我提出建议,我将非常感激。

感谢您的帮助,解决方案:

    //SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    this.DoubleBuffered = true;

1 个答案:

答案 0 :(得分:1)

如果闪烁是问题,那么您可以尝试最小化移动物体被擦除和重新绘制在新位置之间的时间。线程可能无济于事。正如它所说的那样,它可能是一个buffering问题。