2011-08-08 37 views
1

我在我的iOS Cocos2d應用程序上運行40個FPS,有80個Box2d對象。我正在使用固定的時間步:cocos2d沒有運行在60 FPS WITH FIXED TIMESTEP

-(void) update: (ccTime) dt 
{ 
if(gameState_ != kGameStatePaused) { 
world_->Step(dt, 6, 1); 

.... 
} 

爲什麼會發生這種情況?謝謝。

+0

您正在使用一個固定的時間步長爲Box2D的或cocos2d的? – Carter

+0

您是否每幀使用超過16ms的cpu時間? –

回答

1

這是一個更好的固定時間步長:

//FIX TIME STEP 
///////--->>>>>>>>>>>>> 
const float32 FIXED_TIMESTEP = 1.0f/60.0f; 

// Minimum remaining time to avoid box2d unstability caused by very small delta times 
// if remaining time to simulate is smaller than this, the rest of time will be added to the last step, 
// instead of performing one more single step with only the small delta time. 
const float32 MINIMUM_TIMESTEP = 1.0f/600.0f; 

const int32 VELOCITY_ITERATIONS = 8; 
const int32 POSITION_ITERATIONS = 8; 

// maximum number of steps per tick to avoid spiral of death 
const int32 MAXIMUM_NUMBER_OF_STEPS = 25; 
///////<<<<<<<<<<<<<<<<<<------------------- 

//FIX TIME STEP----------->>>>>>>>>>>>>>>> 
-(void)afterStep { 

    // process collisions and result from callbacks called by the step 
} 


-(void)step:(ccTime)dt { 
    float32 frameTime = dt; 
    int stepsPerformed = 0; 
    while ((frameTime > 0.0) && (stepsPerformed < MAXIMUM_NUMBER_OF_STEPS)){ 
     float32 deltaTime = std::min(frameTime, FIXED_TIMESTEP); 
     frameTime -= deltaTime; 
     if (frameTime < MINIMUM_TIMESTEP) { 
      deltaTime += frameTime; 
      frameTime = 0.0f; 
     } 
     world->Step(deltaTime,VELOCITY_ITERATIONS,POSITION_ITERATIONS); 
     stepsPerformed++; 
     [self afterStep]; // process collisions and result from callbacks called by the step 
    } 
    world->ClearForces(); 
} 
//FIX TIME STEP<<<<<<<<<<<<<<<<<------------------ 


-(void) tick: (ccTime) dt 
{ 
    //It is recommended that a fixed time step is used with Box2D for stability 
    //of the simulation, however, we are using a variable time step here. 
    //You need to make an informed choice, the following URL is useful 
    //http://gafferongames.com/game-physics/fix-your-timestep/ 

    // Instruct the world to perform a single step of simulation. It is 
    // generally best to keep the time step and iterations fixed. 
    // world->Step(dt, velocityIterations, positionIterations); 
    [self step:dt]; 

    //Iterate over the bodies in the physics world 
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) 
    { 
     if (b->GetUserData() != NULL) { 

      CCSprite *myActor; 
      myActor = (CCSprite*)b->GetUserData(); 

      myActor.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); 
      myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 

     } 
    } 
}