我正在开发一个控制台应用程序,它会定期执行两个线程:一个用于 tickEvent 函数,另一个用于更新控制台显示。目前,每个线程只是在条件检查时阻塞,直到下一个周期到来。
这种方法有效,但对处理器的要求很高,而且对于我在后台运行的应用程序来说,会导致风扇发出很大的噪音。
当前方法:
static void HandleTickBehaviour()
{
Stopwatch tickDuration = new(); //time tick starts
while (true)
{
tickDuration.Restart();
Tick.Invoke(ElapsedTicks); // invoke all tick event watchers
Profiler.CalcTime.Add(tickDuration.ElapsedMilliseconds); // how long it took for all tick event to run
long targetThreadDelay = (int)(Math.Max(25 - Math.Max(_deltaTime - 25, 0), 0) / 1000d * Stopwatch.Frequency); // how long to wait for next tick (25ms - delta time)
while (true) if (tickDuration.ElapsedTicks >= targetThreadDelay) break;
_deltaTime = tickDuration.ElapsedMilliseconds;
Profiler.TickTime.Add(_deltaTime);
ElapsedTicks++;
}
}
internal static void HandleConsoleRender()
{
Stopwatch frameDuration = new();
while (true)
{
frameDuration.Restart();
RenderConsole();
while (true) if (frameDuration.ElapsedTicks >= displayWindowsTickInterval) break;
Profiler.RenderTime.Add(frameDuration.ElapsedTicks);
}
}
我尝试实现的另一种方法是使用thread.sleep()
,但是由于这些函数每隔几毫秒就会被调用一次,因此重新唤醒线程的延迟实在太多,甚至尝试解释它也会导致更新无法预测地发生。