【问题标题】:How do I implement better time step (fixed or semi-fixed) in box2d?如何在 box2d 中实现更好的时间步长(固定或半固定)?
【发布时间】:2011-03-29 00:02:10
【问题描述】:

我想知道是否有人可以帮助我理解在 box2d 中修复我的时间步长。我试图通过实现更好的时间步来改进我刚刚发布的游戏Bounce Z Ballz(我目前使用内置的可变时间步)。我一直在阅读一些有用的信息,但我无法真正理解将类似于内置 cocos2d/box2d 模板的东西变成类似 Glenn Fiedler's 解决方案的东西。

TL;DR(我想将我的 cocos2d/box2d 游戏时间步从内置的可变时间步更改为更一致的)

谢谢,

史蒂夫

【问题讨论】:

    标签: cocos2d-iphone box2d-iphone physics-engine


    【解决方案1】:

    为了实现这一点,您需要知道物理引擎在仍能充分执行的情况下可以步进的最大时间步长。为了论证的缘故,假设它是 0.03 秒。

    本质上,在您的更新循环期间,您不仅要将增量时间传递给步长时间,还需要将其分成最大尺寸的段。因此,如果当前循环周期的增量时间为 0.08 秒,那么您将需要运行更新循环 3 次,时间步长为 0.03 秒、0.03 秒、0.02 秒。物理系统仍然前进了 0.08 秒,但它会以足够小的步幅完成,以便正确执行。

    Update:(float)deltaTime  
    {  
        float maximumStep = 0.03;  
        float progress = 0.0;  
        while (progress < deltaTime)  
        {  
            float step = min((deltaTime-progress), maxStep);  
            **PHYSICS STEP(step)**  
            progress += step;  
        }  
    }
    

    【讨论】:

    • 好的,谢谢乔丹。这是迄今为止我听到的最简单的解释。所以在我调用的 init 方法中: [self schedule: @selector(tick:)] 是否需要包含其他参数?此外,此实现是否会在可能以不同 FPS 显示的不同设备(即 iphone 3gs 和 iphone 4)上创建一致(几乎相同,如果不相同)的模拟?
    • 是的,基本上。这一切都取决于您选择 maximumStep 值的程度。尝试一下,并检查 box2d 的文档以查看它们是否建议了一个值。但是,还要注意,将值设置得太低会降低整体性能,因为物理系统必须更频繁地工作。
    • 太棒了。我已经实施了这个解决方案,一切似乎都运行得更加一致。我需要对其进行更多测试,但再次感谢 Jordaan,这就是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多