2013-06-17 1 views
0

나는 누군가 비슷한 질문을하기 전에해야 할 것 같지만 여기에 간다.cocos2d iphone에서 버그 다시 만들기

게임을하는 동안 버그가 발생하면 기록 된 게임을 나중에 고정 빌드로 다시 사용하여 버그가 수정되었는지 확인할 수 있도록하는 것이 유용 할 것입니다. 나는 box2d도 사용하고 있는데, 을 사용하고 있는데 box2d가 실제로 결정적이 아닌 것처럼 보인다는 것을 기억하지만 적어도 처음부터 상태의 대부분을 재현 할 수있는 경우가 많습니다. 동일한 무작위 값을 재현하는 것은 내가 생각하는 동일한 시간 등을 복 원합니다. 어떤 통찰력?

  • 나는 다양한 성공을 거둔 호리 호리 해다. 연극을 녹음하고 나중에 재생할 수 있다는 것을 알고 있습니다. 난 그냥 임의의 값을 다시 생성하지 않을 것이라고 가정합니다.

  • Box2D의 질문에 빠른 모양과 내가 Box2D의 생각은 동일한 입력에 대한 충분한

결정하고, 같은 이진, Box2D의 어떤 시뮬레이션을 재현합니다. Box2D는 난수를 사용하지 않으며 임의의 이벤트 (예 : 타이머 등)에 대해 계산을 기반으로하지 않습니다.

그러나 사람들은 종종 더 엄격한 결정론을 원합니다. 사람들은 종종 이 Box2D가 다른 바이너리와 다른 플랫폼에서 동일한 결과를 생성 할 수 있는지 알고 싶어합니다. 내 대답은 아니오 야. 이 이유는 부동 소수점 연산이 많은 컴파일러 및 프로세서 에 구현 된 이유와 관련이 있습니다. 당신 호기심이 있다면이 기사를 읽어 보시기 바랍니다 : http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

답변

1

당신은 그것은에 그 쓰기 꽤 간단합니다 플레이어가 세계에 (예 : POD 구조체 인치)마다 단계를 제공하는 입력 상태를 캡슐화하는 경우 파일. 상응하는 방법이 있습니다 ~) 의심의 여지 :

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++ 중심 코드 :이 같은 때마다 단계를 뭔가를 할 수있는 그런

struct inputStruct { 
    bool someButtonPressed; 
    bool someOtherKeyPressed; 
    float accelerometerZ; 
    ... etc 
}; 

: 예를 들어, 입력 상태와 같이 있다고 가정 Objective-C로 할 수 있습니다.

이 방법을 사용하면 파일의 입력이 모두 소진 된 경우 실시간 제어를 다시 시작할 수 있습니다. 'file'은 레벨이로드 될 때 적절한 모드 (rb 또는 wb)로 열어야하는 FILE *입니다. 당신이 쫓고있는 버그로 인해 충돌이 발생하는 경우 충돌이 발생하기 전에 입력 상태가 실제로 기록되는지 확인하기 위해 작성한 후 fflush해야 할 수도 있습니다.

다른 플랫폼에서 작동하는 것이 거의 없습니다. 재생 파일이 기록한 장치 이외의 다른 장치에서 동일한 결과를 재생한다고 가정하면 안됩니다 (디버깅 목적으로는 좋음).

임의의 값에 대해서는 Box2D 세계에 영향을 줄 수있는 임의의 값을 사용하는 모든 것이 다른 코드와 공유되지 않는 결정 론적 랜덤 생성기를 통과해야하며, 각 재생에 사용되었습니다.http://en.wikipedia.org/wiki/Mersenne_twister

내가 '공유하지 않는다'고 말할 때, MT 알고리즘을 사용하여 순수하게 렌더링 목적으로 입자에 대한 임의의 방향을 생성한다고 가정합니다. 물리학 관련 임의 화와 마찬가지로 동일한 생성기 인스턴스를 사용하려고합니다.

관련 문제