很好的实践,在实现异步2d winforms元素时使用模式



如果有人能就以下主题为我提供建议,我将不胜感激:

我准备了一个小的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;

如果闪烁是问题所在,那么您可以尝试将移动对象被擦除和在新位置重新绘制之间的时间最小化。线程可能没有帮助。正如它86所说,这可能是一个缓冲问题。

最新更新