请考虑以下测试程序。 我有三个特定间隔的任务。 [task1-- task1Interval,[task2-- task2Interval,[task3-- task3Interval] 我想使用单个计时器来执行所有三个任务。 当interval为整数时,每件事都可以正常工作。 我们希望用双间隔值实现相同的功能,例如[task1Interval-- 0.1,[task2Interval-- 2.1,[task3Interval-- 3.1]。
任何针对相同的指针都将受到高度赞赏。
public class Class1
{
private System.Timers.Timer _timer;
private int _counter=0;
private int task1Interval = 1;
private int task2Interval = 2;
private int task3Interval = 3;
public void Start()
{
this._timer = new System.Timers.Timer(100);
this._timer.AutoReset = true;
this._timer.Elapsed += new System.Timers.ElapsedEventHandler(this.serviceTimerElapse);
this._timer.Enabled = true;
this._timer.Start();
}
private void serviceTimerElapse(object source, System.Timers.ElapsedEventArgs e)
{
this._counter++;
if (this._counter % task1Interval == 0)
{
task1();
}
if (this._counter % task2Interval == 0)
{
task2();
}
if (this._counter % task3Interval == 0)
{
task3();
}
}
private void task1()
{
Console.WriteLine("task1 started");
}
private void task2()
{
Console.WriteLine("task2 started");
}
private void task3()
{
Console.WriteLine("task3 started");
}
}
答案 0 :(得分:0)
这与您在原始游戏引擎中看到的非常相似。你需要一个具有某种粒度级别的世界“时钟”,你可以处理每个“tick”中的每个事件。
您已经知道您的粒度需要是您的间隔中最小的分母(在这种情况下为0.1)。然后,原始解决方案将包括每个任务的计数器以及阈值。
Ex(伪代码):
private const double TICK = 0.1;
private double TASK_1_THRESHOLD = 0.1;
private double TASK_1_COUNT = 0.0;
private double TASK_2_THRESHOLD = 2.1;
private double TASK_2_COUNT = 0.0;
private double TASK_3_THRESHOLD = 3.1;
private double TASK_3_COUNT = 0.0;
private void tick()
{
TASK_1_COUNT += TICK;
TASK_2_COUNT += TICK;
TASK_3_COUNT += TICK;
if (TASK_1_COUNT >= TASK_1_THRESHOLD) {
TASK_1_COUNT = 0.0;
task1();
}
// do this for each
}