【发布时间】:2012-06-01 11:05:55
【问题描述】:
我已经实现了一个简单的多线程服务器\客户端游戏作为我大学的作业。
在客户端除了主线程还有:
1-thread 负责绘制游戏场地和表格上的玩家。
2-thread 与服务器通信以发送方向并接收位置和其他信息。
首先我使用了调用技术,但它不起作用,因为我在处理它之后使用了 Graphics。见Draw on a form by a separate thread
所以为了避免这种情况并规范绘图线程,我只是在绘图线程上的每个特定时间提升标志“无效”并将其实际处理留给主线程:
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 毫秒已经太多了。 有什么建议吗?
[编辑]
我意识到我正在从代码和属性编辑器中设置双缓冲标志,这导致了问题(这可能是个愚蠢的想法),但我花了半个小时用其中一个标志和他们两个,当我从两个地方设置双缓冲标志时出现的问题,我的问题已经解决了,但是现在我需要知道这是否可以解决它。
【问题讨论】:
-
展示你如何使用双缓冲,sn-p 中没有证据。
-
如果您将其空白然后在其上绘制缓冲图像,则可能会发生这种情况。而不是最后一张的缓冲图像。
-
我们可以假设这是winforms吗?什么是绘画、图片框、面板……的控件?
-
@HansPassant:我添加了双缓冲设置代码
-
将 DoubleBuffered 属性设置为 true。
标签: c# winforms multithreading drawing