2012-03-16 50 views
0

一个简单的平局和移动模拟使用下列内容:简单的模拟:快进和普通计时器

时钟计时器。间隔:200ms运动计时器。时间间隔:1ms运动常量。值:2.

每次蜱移动定时器,图像通过加入由移动常数移动。 (即picture.X = picture.X +移动常数)

问题是快速转发。用户可以随时快速进行模拟。

如何更改这三个值(时钟计时器,运动计时器,运动常数),以便在快速转发运行期间提高仿真速度而不牺牲完整性?

回答

2

如果用于快速转发的整数倍数(1x,2x,3x,...)足够多,则可以在定时器处理函数期间多次运行仿真函数。

虽然我不确定你在做什么,但是同样的原则适用于它所做的任何事情。

+0

时钟计时器运行一个时钟,反过来会评估图片应该到达的时间。这就是为什么我担心快速转发时sim不会一样。另外,我不能加速我的时钟计时器,因为它是最低的:1ms。我应该将运动常数改变为什么值? – helix 2012-03-16 13:44:59

+0

如果你只是多次运行模拟函数,你不需要加速定时器:而不是'picture.X + = movementConstant;'你会为(int i = 0; i AKX 2012-03-16 13:49:05

+0

是的,我提出了一个超超简化的版本,只是为了提问。我会尝试你的建议,没有想到这一点。我希望额外的for循环不会太多,因为sim会计算大量数据。谢谢。 编辑:它似乎工作,但时间不一致存在尤其是。对于更大的倍数。 (4x,5x ...)我会做一个深入的测试。 – helix 2012-03-16 14:51:28

1

您可以拥有与“实时”无关的“内部时间”。当系统以基础速度运行时,这两个同步增加(定时器的每个滴答声 - 设置为1 ms) - 内部时间增加1ms。
当您有2倍的加速倍数时,将2ms添加到内部时间为每个时钟滴答。

下一步,您必须根据内部的时间来计算位置,有可能像隐含

newposition = startposition + speed * time 
1

正如汉斯的功能,有一个“粒度”的时间和空间,然后通过跳过时间间隔来调度代理('ticks')然而,如果您需要更灵活和经过充分测试的调度,您可能需要借用ABM中的调度程序模拟软件包,如Mason(用于Java)或Repast(Java或C++),或查看他们的开源调度程序类代码并转换为其他语言。