大学の課題として、単純なマルチスレッドのServer\Clientゲームを実装しました。
メインスレッドに加えて、クライアント側には次のものがあります。
1-フォーム上の遊び場とプレーヤーの描画を担当するスレッド。
サーバーと通信して道順を送信し、場所やその他の情報を受信する2スレッド。
最初はinvokeテクニックを使用しましたが、廃棄後にグラフィックを使用していたため、機能しませんでした。別のスレッドでフォームに描画するを参照してください
したがって、これを回避して描画スレッドを正規化するために、描画スレッドで特定の時間ごとにフラグ「無効化」を発生させ、実際の処理をメインスレッドに任せます。
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はもう多すぎると思います。何かアドバイス?
[編集]
コードとプロパティエディタからダブルバッファリングフラグを設定していることに気付きました(これはばかげた考えかもしれません)が、フラグの1つと両方を使用してコードをテストするのに30分を費やしました、2つの場所からダブルバッファリングフラグを設定したときに発生した問題、私の問題は解決しましたが、これがそれを解決したのかどうかを知る必要があります。