我已经实现了一个简单的多线程服务器\客户端游戏作为我大学的任务。为什么我的表单闪烁
上除了主线程客户端有:
1线程负责画图玩的理由和形式对玩家的。
2线程与服务器通信以发送方向和接收的位置和其他信息。
首先我使用的调用技术,但因为我用的是它的图形配置后,没有工作。看到Draw on a form by a separate thread
所以为了避免和规范引出线,我只是升旗“的Invalidate”引出线上的每一个具体的时间,离开它的实际操作主线程:
public Form1()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
InitializeComponent();
}
private void Draw()
{
while (true)
{
Thread.Sleep(200);
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (map.hasGraph)
{
map.Draw(e.Graphics);
if (this.Index != null)
e.Graphics.FillRectangle(Brush, Rectangle);
if (OpponentIndex != null)
e.Graphics.FillRectangle(OpponentBrush, OpponentRectangle);
}
}
这里的问题是,形式是任意的方式闪烁,即使我使用双缓冲,当我增加睡眠时间引出线减少闪烁,但我认为200ms的已经太多了。 有什么建议吗?
[编辑]
我意识到,我是从代码和这使得问题的属性编辑器设置双缓冲标志(这可能是一个愚蠢的想法),但我花了一个半小时的测试我代码与其中一个标志和他们两个,当我从两个地方设置双缓冲标志时引发的问题,我的问题已解决,但现在我需要知道这是否可以解决它。
显示您如何使用双缓冲,有一个为没有证据它在片段中。 –
这可能会发生,如果你把它抹掉,然后将你的缓冲图像绘制到它上面。而不是最后一个缓冲图像。 – Doomsknight
我们可以假设这是winforms吗?什么是绘画,绘画盒,面板的控制? –