Ian*_*ugh 2 .net c# multithreading drawing
如果"自行车"列表中的一个对象包含布尔isBoosting,我试图更快地绘制线().当列表包含两辆自行车时,结果是当两辆自行车中只有一辆"isBoosting"时,两辆自行车似乎都加速了.有没有人知道为什么?如果对象不包含isBoosting的值,那么线程是否应该"移动"更慢?
foreach (LightBike b in bikes) //draw bikes
{
if (b.isBoosting && b.boostCounter > 0) //player is boosting
{
Thread.Sleep(GAME_SPEED - 5);
b.boostCounter--;
if (b.boostCounter == 0)
{
b.isBoosting = false;
b.boostCounter = 20;
}
}
else
{
Thread.Sleep(GAME_SPEED);
}
canvas.DrawLine(new Pen(b.color, BIKE_SIZE) { EndCap = System.Drawing.Drawing2D.LineCap.Square }, b.location, b.getNextLocation());
}
Run Code Online (Sandbox Code Playgroud)
这有几个问题.
首先,由于它是一个单独的线程,当你睡眠一段时间后,线程被取消安排 - 不会进行渲染(在你的情况下,这意味着既不会"提升"自行车也不会绘制其他自行车).实际绘制的线将始终从b.location变为b.getNextLocation(),对于增强和未增强的自行车,它们(我假设)是相等的.
其次,你将逻辑与渲染代码混合在一起......
实际上你应该将自行车作为某种模型来实现,并区分模型中的自行车速度和渲染,从而将其保持在渲染代码之外.
理想情况下,该模型将包含每个自行车的速度矢量(由刻度计上的加速度矢量修改,与渲染周期无关),并且所有渲染都将绘制相应的线.
因此,基本上将您的增强代码放入b.getNextLocation()而不是Draw()中,并从绘图代码中删除条件语句.
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |