Debugging 在cocos2d iphone中重新创建bug

Debugging 在cocos2d iphone中重新创建bug,debugging,cocos2d-iphone,box2d,Debugging,Cocos2d Iphone,Box2d,我想以前一定有人问过类似的问题,但现在是这样 能够记录游戏是很有用的,这样,如果游戏中发生了错误,记录的游戏可以在以后使用固定版本重新使用,以确认错误是否已修复。我也在使用box2d,从我的记忆来看,box2d似乎不是真正的确定性,但至少在许多情况下,能够从第一次重新创建大部分状态是可以的。重新创建相同的随机值将需要恢复相同的时间等,我认为。有什么见解吗 我一直在摆弄葫芦ios,取得了各种各样的成功。我知道可以录制剧本,然后在那里播放。我只是假设它不会重新创建随机值 快速查看一下box2d常见

我想以前一定有人问过类似的问题,但现在是这样

能够记录游戏是很有用的,这样,如果游戏中发生了错误,记录的游戏可以在以后使用固定版本重新使用,以确认错误是否已修复。我也在使用box2d,从我的记忆来看,box2d似乎不是真正的确定性,但至少在许多情况下,能够从第一次重新创建大部分状态是可以的。重新创建相同的随机值将需要恢复相同的时间等,我认为。有什么见解吗

  • 我一直在摆弄葫芦ios,取得了各种各样的成功。我知道可以录制剧本,然后在那里播放。我只是假设它不会重新创建随机值

  • 快速查看一下box2d常见问题解答,我认为box2d已经足够确定了

对于相同的输入和相同的二进制文件,Box2D将复制任何 模拟Box2D不使用任何随机数,也不使用任何基数 对随机事件(如计时器等)的计算

然而,人们往往想要更严格的决定论。人们经常 想知道Box2D是否可以在不同的计算机上产生相同的结果 不同平台上的二进制文件和。答案是否定的 这个答案与浮点数学在计算机中的实现方式有关 许多编译器和处理器。如果你愿意,我建议你阅读这篇文章 你很好奇:


如果您封装了玩家在每个时间步(例如,在POD结构中)向世界提供的输入状态,那么将其写入文件就相当简单了。例如,假设您有如下输入状态:

struct inputStruct {
    bool someButtonPressed;
    bool someOtherKeyPressed;
    float accelerometerZ;
    ... etc
};
然后,您可以在每个时间步执行类似的操作:

inputStruct currentState;
currentState.someButtonPressed = ...; // set contents from live user input

if ( recording )
    fwrite( &currentState, sizeof(inputStruct), 1, file );
else if ( replaying ) {
    inputStruct tmpState;
    int readCount = fread( &tmpState, sizeof(inputStruct), 1, file );
    if ( readCount == 1 )
        currentState = tmpState; //overwrite live input
}

applyState( currentState ); // apply forces, game logic from input

world->Step( ... ); // step the Box2D world
<请原谅C++中心代码:~)毫无疑问,有Objto-C./P>的等价方法。 此方法允许您在文件输入用完时重新获得实时控制权。”“文件”是一个文件*,加载该级别时必须以适当的模式(rb或wb)打开该文件。如果您正在跟踪的bug导致崩溃,那么您可能需要在写入之后进行fflush,以确保在崩溃之前确实写入了输入状态

正如您所注意到的,这不太可能在不同的平台上工作。您不应该假设重播文件将在记录它的设备以外的任何设备上重现相同的结果(这对于调试来说应该是好的)

至于随机值,您需要确保使用随机值的任何可能影响Box2D世界的东西都经过一个确定性随机生成器,该生成器不与其他代码共享,并且您需要记录每次重播使用的种子。您可能想使用Mersenne Twister的众多实现之一,这些实现可以在

当我说“不共享”时,假设您也使用MT算法为粒子生成随机方向,纯粹是为了渲染目的-您不希望使用与物理相关的随机化相同的生成器实例