我已经实现了一个简单的多线程服务器\客户端游戏作为我大学的作业。
在客户端除了主线程还有:
1-thread 负责绘制游戏场地和表格上的玩家。
2线程与服务器通信以发送方向并接收位置和其他信息。
首先我使用了调用技术,但它不起作用,因为我在处理它之后使用了 Graphics。请参阅通过单独的线程在表单上绘图
所以为了避免这种情况并规范绘图线程,我只是在绘图线程上的每个特定时间提升标志'无效'并将其实际处理留给主线程:
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);
}
}
这里的问题是,即使我使用双缓冲,表单也会以任意方式闪烁,并且当我增加绘图线程的睡眠时间时,闪烁会减少,但我认为 200 毫秒已经太多了。有什么建议吗?
[编辑]
我意识到我正在从产生问题的代码和属性编辑器中设置双缓冲标志(这可能是一个愚蠢的想法),但我花了半个小时用一个标志和两个标志来测试我的代码,当我从两个地方设置双缓冲标志时出现的问题,我的问题已解决,但现在我需要知道这是否可以解决它。