【问题标题】:Simple Simulation: Fast Forward and Normal Timer简单模拟:快进和普通定时器
【发布时间】:2012-03-16 13:37:04
【问题描述】:

一个简单的绘制和移动模拟使用以下内容:

时钟计时器。间隔:200 毫秒运动计时器。间隔:1ms运动常数。值:2。

每次运动计时器滴答作响,图片都会通过运动常数的加法运动。 (即图片.X = 图片.X + 运动常数)

问题在于快进。用户可以随时快进模拟。

如何更改这三个值(时钟计时器、运动计时器、运动常数)以在快进运行期间不牺牲完整性的情况下加快模拟速度?

【问题讨论】:

    标签: c# timer simulation


    【解决方案1】:

    如果整数倍数(1x, 2x, 3x, ...)用于快速转发就足够了,您可以在计时器处理函数期间多次运行模拟函数。

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

    【讨论】:

    • 时钟计时器运行一个时钟,该时钟反过来会评估图片何时应该到达。这就是为什么我担心快进时SIM卡会不一样。另外,我不能加快我的时钟定时器,因为它是最低的:1ms。我应该将运动常数更改为什么值?
    • 如果你只运行几次模拟函数,你就不需要加速计时器:你可以用for(int i = 0; i < speedFactor; i++) picture.X += movementConstant;代替picture.X += movementConstant;。 (我假设您的模拟功能在现实中要复杂一些:))
    • 是的,我放了一个超超超简化的版本只是为了问问。我会试试你的建议,没想到。我希望额外的 for 循环不会太多,因为 sim 会计算大量数据。谢谢你。编辑:它似乎正在工作,但存在时间不一致,尤其是。对于更大的倍数。 (4x,5x...)我会做一个深入的测试。
    【解决方案2】:

    您可以拥有一个独立于“实时”的“内部时间”。当系统以基本速度运行时,这两个同步增加(计时器的每个滴答声 - 设置为 1 毫秒 - 内部时间增加 1 毫秒。
    当您有 2 倍的加速倍数时,为每个计时器滴答声增加 2 毫秒的内部时间。

    接下来,您将不得不根据内部时间计算位置,可能使用类似的函数

    newposition = startposition + speed * time
    

    【讨论】:

      【解决方案3】:

      正如 Hans 所暗示的,在大多数模拟中,时间和空间上都存在“粒度”。然后通过跳过时间间隔(“滴答”)来安排代理。但是,如果您需要更灵活且经过良好测试的调度,您可能需要从 ABM 模拟包中借用调度器,例如 Mason(用于 Java)或 Repast(Java 或 C++),或者查看它们的开源调度器类代码并翻译成另一种语言。

      【讨论】:

        猜你喜欢
        • 2015-08-26
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 2011-06-28
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        相关资源
        最近更新 更多