【发布时间】:2012-03-16 13:37:04
【问题描述】:
一个简单的绘制和移动模拟使用以下内容:
时钟计时器。间隔:200 毫秒。 运动计时器。间隔:1ms。 运动常数。值:2。
每次运动计时器滴答作响,图片都会通过运动常数的加法运动。 (即图片.X = 图片.X + 运动常数)
问题在于快进。用户可以随时快进模拟。
如何更改这三个值(时钟计时器、运动计时器、运动常数)以在快进运行期间不牺牲完整性的情况下加快模拟速度?
【问题讨论】:
标签: c# timer simulation
一个简单的绘制和移动模拟使用以下内容:
时钟计时器。间隔:200 毫秒。 运动计时器。间隔:1ms。 运动常数。值:2。
每次运动计时器滴答作响,图片都会通过运动常数的加法运动。 (即图片.X = 图片.X + 运动常数)
问题在于快进。用户可以随时快进模拟。
如何更改这三个值(时钟计时器、运动计时器、运动常数)以在快进运行期间不牺牲完整性的情况下加快模拟速度?
【问题讨论】:
标签: c# timer simulation
如果整数倍数(1x, 2x, 3x, ...)用于快速转发就足够了,您可以在计时器处理函数期间多次运行模拟函数。
虽然我不确定你在用时钟定时器做什么,但同样的原则适用于它正在做的任何事情。
【讨论】:
for(int i = 0; i < speedFactor; i++) picture.X += movementConstant;代替picture.X += movementConstant;。 (我假设您的模拟功能在现实中要复杂一些:))
您可以拥有一个独立于“实时”的“内部时间”。当系统以基本速度运行时,这两个同步增加(计时器的每个滴答声 - 设置为 1 毫秒 - 内部时间增加 1 毫秒。
当您有 2 倍的加速倍数时,为每个计时器滴答声增加 2 毫秒的内部时间。
接下来,您将不得不根据内部时间计算位置,可能使用类似的函数
newposition = startposition + speed * time
【讨论】:
正如 Hans 所暗示的,在大多数模拟中,时间和空间上都存在“粒度”。然后通过跳过时间间隔(“滴答”)来安排代理。但是,如果您需要更灵活且经过良好测试的调度,您可能需要从 ABM 模拟包中借用调度器,例如 Mason(用于 Java)或 Repast(Java 或 C++),或者查看它们的开源调度器类代码并翻译成另一种语言。
【讨论】: